From 873ba9edc87c8157e84e2fb05cf71b469ec285d4 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:19:31 -0500 Subject: [PATCH 01/71] created serialization pipeline class --- .../SerializationPipeline.ts | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts new file mode 100644 index 000000000000..9b3db5dda3f3 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -0,0 +1,115 @@ +import { SerializationFormat, SerializationFormatConfig } from "./SerializationFormat"; +import { ZurgFormat } from "./formats/ZurgFormat"; +import { ZodFormat } from "./formats/ZodFormat"; +import { NoneFormat } from "./formats/NoneFormat"; + +/** + * Supported serialization format types + */ +export type SerializationFormatType = "default" | "zurg" | "zod" | "none"; + +/** + * Configuration for creating a SerializationPipeline + */ +export interface SerializationPipelineConfig extends SerializationFormatConfig { + /** + * The serialization format to use. + * - "default" or "zurg": Use Zurg (bundled runtime) + * - "zod": Use Zod (npm dependency) - NOT YET IMPLEMENTED + * - "none": No serialization + */ + format: SerializationFormatType; +} + +/** + * SerializationPipeline manages the creation and configuration of serialization formats. + * It provides a unified interface for generating schema AST code regardless of the + * underlying format being used. + */ +export class SerializationPipeline { + private readonly format: SerializationFormat; + private readonly formatType: SerializationFormatType; + + constructor(config: SerializationPipelineConfig) { + this.formatType = config.format; + this.format = this.createFormat(config); + } + + /** + * Create the appropriate serialization format based on configuration + */ + private createFormat(config: SerializationPipelineConfig): SerializationFormat { + switch (config.format) { + case "default": + case "zurg": + return new ZurgFormat(config); + + case "zod": + return new ZodFormat(config); + + case "none": + return new NoneFormat(config); + + default: + throw new Error(`Unknown serialization format: ${config.format}`); + } + } + + /** + * Get the active serialization format + */ + public getFormat(): SerializationFormat { + return this.format; + } + + /** + * Get the format type string + */ + public getFormatType(): SerializationFormatType { + return this.formatType; + } + + /** + * Check if serialization is enabled + */ + public isEnabled(): boolean { + return this.formatType !== "none"; + } + + /** + * Get runtime dependencies required by the active format + */ + public getRuntimeDependencies(): Record { + return this.format.getRuntimeDependencies(); + } + + /** + * Get runtime file patterns for the active format + * Returns null if the format uses npm dependencies instead of bundled files + */ + public getRuntimeFilePatterns(): { patterns: string[]; ignore?: string[] } | null { + return this.format.getRuntimeFilePatterns(); + } + + /** + * Helper to determine the format type from legacy noSerdeLayer config + */ + public static resolveFormatType(options: { + serializationFormat?: SerializationFormatType; + noSerdeLayer?: boolean; + }): SerializationFormatType { + // If explicit format is provided, use it + if (options.serializationFormat != null) { + return options.serializationFormat; + } + + // Fall back to noSerdeLayer logic for backward compatibility + if (options.noSerdeLayer === true) { + return "none"; + } + + // Default to Zurg + return "default"; + } +} + From 6aab21ad93acf0ac9ebf20ef8102979026b367b0 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:20:15 -0500 Subject: [PATCH 02/71] added serialization format to express config --- .../express/cli/src/custom-config/ExpressCustomConfig.ts | 3 +++ .../custom-config/schema/ExpressCustomConfigSchema.ts | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/generators/typescript/express/cli/src/custom-config/ExpressCustomConfig.ts b/generators/typescript/express/cli/src/custom-config/ExpressCustomConfig.ts index 1894e620be11..92cb0b9e670a 100644 --- a/generators/typescript/express/cli/src/custom-config/ExpressCustomConfig.ts +++ b/generators/typescript/express/cli/src/custom-config/ExpressCustomConfig.ts @@ -1,3 +1,5 @@ +import { SerializationFormatType } from "@fern-typescript/commons"; + // this is the parsed config shape. to view the allowed options for generators.yml, // see ExpressCustomConfigSchema.ts export interface ExpressCustomConfig { @@ -8,6 +10,7 @@ export interface ExpressCustomConfig { includeOtherInUnionTypes: boolean; treatUnknownAsAny: boolean; noSerdeLayer: boolean; + serializationFormat: SerializationFormatType; skipRequestValidation: boolean; skipResponseValidation: boolean; requestValidationStatusCode: number; diff --git a/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts b/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts index acf760eef389..d5e678c86c4a 100644 --- a/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts +++ b/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts @@ -1,11 +1,20 @@ import { z } from "zod"; +/** + * Serialization format options: + * - "default": Use Zurg (bundled runtime) - same as legacy behavior + * - "zod": Use Zod as npm dependency + * - "none": No serialization layer - same as noSerdeLayer: true + */ +const SerializationFormatSchema = z.enum(["default", "zod", "none"]); + export const ExpressCustomConfigSchema = z.strictObject({ useBrandedStringAliases: z.optional(z.boolean()), optionalImplementations: z.optional(z.boolean()), doNotHandleUnrecognizedErrors: z.optional(z.boolean()), treatUnknownAsAny: z.optional(z.boolean()), noSerdeLayer: z.optional(z.boolean()), + serializationFormat: z.optional(SerializationFormatSchema), skipRequestValidation: z.optional(z.boolean()), skipResponseValidation: z.optional(z.boolean()), outputEsm: z.optional(z.boolean()), From 32a26ffebd8b6c62611cc0a4f38f0d1b94bae90b Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:21:57 -0500 Subject: [PATCH 03/71] added serialization format to the sdk custom config --- .../typescript/sdk/cli/src/custom-config/SdkCustomConfig.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/generators/typescript/sdk/cli/src/custom-config/SdkCustomConfig.ts b/generators/typescript/sdk/cli/src/custom-config/SdkCustomConfig.ts index 2e6803490b99..189924311395 100644 --- a/generators/typescript/sdk/cli/src/custom-config/SdkCustomConfig.ts +++ b/generators/typescript/sdk/cli/src/custom-config/SdkCustomConfig.ts @@ -1,3 +1,5 @@ +import { SerializationFormatType } from "@fern-typescript/commons"; + // this is the parsed config shape. to view the allowed options for generators.yml, // see SdkCustomConfigSchema.ts export interface SdkCustomConfig { @@ -24,6 +26,7 @@ export interface SdkCustomConfig { treatUnknownAsAny: boolean; includeContentHeadersOnFileDownloadResponse: boolean; noSerdeLayer: boolean; + serializationFormat: SerializationFormatType; noOptionalProperties: boolean; includeApiReference: boolean | undefined; tolerateRepublish: boolean; From af57717232d1b82775d107239cc426a1c0dc718c Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:22:13 -0500 Subject: [PATCH 04/71] index export --- generators/typescript/utils/commons/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/generators/typescript/utils/commons/src/index.ts b/generators/typescript/utils/commons/src/index.ts index e0bd50858eb2..e94e583cd3c3 100644 --- a/generators/typescript/utils/commons/src/index.ts +++ b/generators/typescript/utils/commons/src/index.ts @@ -34,6 +34,7 @@ export * from "./public-exports-manager"; export * from "./referencing"; export { removeUndefinedAndNullFromTypeNode } from "./removeUndefinedAndNullFromTypeNode"; export { type TypeReferenceNode } from "./TypeReferenceNode"; +export * from "./serialization-pipeline"; export * from "./typescript-project"; export { convertJestImportsToVitest } from "./typescript-project/convertJestImportsToVitest"; export { fixImportsForEsm } from "./typescript-project/fixImportsForEsm"; From 17b6cc4cd5188c165226c4836504c69d9aa6135c Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:25:06 -0500 Subject: [PATCH 05/71] added serialization formation --- .../SerializationFormat.ts | 367 ++++++++++++++++++ 1 file changed, 367 insertions(+) create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts new file mode 100644 index 000000000000..32e2a587e21d --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts @@ -0,0 +1,367 @@ +import { ts } from "ts-morph"; + +import { Reference } from "../referencing"; + +/** + * Options passed to schema parse/json operations + */ +export interface SchemaOptions { + unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; + allowUnrecognizedUnionMembers?: boolean; + allowUnrecognizedEnumValues?: boolean; + skipValidation?: boolean; + omitUndefined?: boolean; + breadcrumbsPrefix?: string[]; +} + +/** + * Base schema interface that all format-specific schemas must implement. + * This represents a schema that can generate TypeScript AST expressions. + */ +export interface Schema { + /** + * Generates the TypeScript AST expression for this schema definition + */ + toExpression: () => ts.Expression; + + /** + * Whether this schema represents an optional value + */ + isOptional: boolean; + + /** + * Whether this schema represents a nullable value + */ + isNullable: boolean; +} + +/** + * Extended schema interface with utility methods for transformations + */ +export interface SchemaWithUtils extends Schema { + /** + * Generate parse expression: raw JSON -> parsed type + */ + parse: (raw: ts.Expression, opts: Required) => ts.Expression; + + /** + * Generate json expression: parsed type -> raw JSON + */ + json: (parsed: ts.Expression, opts: Required) => ts.Expression; + + /** + * Generate parseOrThrow expression + */ + parseOrThrow: (raw: ts.Expression, opts: Required) => ts.Expression; + + /** + * Generate jsonOrThrow expression + */ + jsonOrThrow: (parsed: ts.Expression, opts: Required) => ts.Expression; + + /** + * Wrap schema to allow null values + */ + nullable: () => SchemaWithUtils; + + /** + * Wrap schema to allow undefined values + */ + optional: () => SchemaWithUtils; + + /** + * Wrap schema to allow both null and undefined values + */ + optionalNullable: () => SchemaWithUtils; + + /** + * Apply a transform to the schema + */ + transform: (args: { + newShape: ts.TypeNode | undefined; + transform: ts.Expression; + untransform: ts.Expression; + }) => SchemaWithUtils; +} + +/** + * Schema interface for object-like types (objects, unions) + */ +export interface ObjectLikeSchema extends SchemaWithUtils { + /** + * Add computed properties to the parsed output + */ + withParsedProperties: (properties: AdditionalProperty[]) => ObjectLikeSchema; +} + +/** + * Schema interface for object types with extend/passthrough capabilities + */ +export interface ObjectSchema extends ObjectLikeSchema { + /** + * Extend this object schema with another schema's properties + */ + extend: (extension: Schema) => ObjectSchema; + + /** + * Allow unknown properties to pass through + */ + passthrough: () => ObjectSchema; +} + +/** + * Property definition for object schemas + */ +export interface Property { + key: { + /** The property name in the parsed TypeScript type */ + parsed: string; + /** The property name in the raw JSON */ + raw: string; + }; + value: Schema; +} + +/** + * Additional property to be added during parsing + */ +export interface AdditionalProperty { + key: string; + getValue: (args: { getReferenceToParsed: () => ts.Expression }) => ts.Expression; +} + +/** + * Arguments for creating a discriminated union schema + */ +export interface UnionArgs { + /** The discriminant property name in the parsed type */ + parsedDiscriminant: string; + /** The discriminant property name in the raw JSON */ + rawDiscriminant: string; + /** The union member types */ + singleUnionTypes: SingleUnionType[]; +} + +/** + * A single variant of a discriminated union + */ +export interface SingleUnionType { + /** The discriminant value that identifies this variant */ + discriminantValue: string; + /** Schema for the non-discriminant properties */ + nonDiscriminantProperties: ObjectSchema; +} + +/** + * Runtime dependencies required by the serialization format + */ +export interface RuntimeDependency { + name: string; + version: string; +} + +/** + * The main serialization format protocol. + * Each format (Zurg, Zod, etc.) implements this interface. + */ +export interface SerializationFormat { + /** + * Unique identifier for this format + */ + readonly name: "zurg" | "zod" | "none"; + + // ==================== Schema Builders ==================== + + /** + * Create an object schema with the given properties + */ + object: (properties: Property[]) => ObjectSchema; + + /** + * Create an object schema where all properties are required (no optionals) + */ + objectWithoutOptionalProperties: (properties: Property[]) => ObjectSchema; + + /** + * Create a discriminated union schema + */ + union: (args: UnionArgs) => ObjectLikeSchema; + + /** + * Create an undiscriminated union schema + */ + undiscriminatedUnion: (schemas: Schema[]) => SchemaWithUtils; + + /** + * Create an array/list schema + */ + list: (itemSchema: Schema) => SchemaWithUtils; + + /** + * Create a Set schema + */ + set: (itemSchema: Schema) => SchemaWithUtils; + + /** + * Create a Record/Map schema + */ + record: (args: { keySchema: Schema; valueSchema: Schema }) => SchemaWithUtils; + + /** + * Create an enum schema + */ + enum: (values: string[]) => SchemaWithUtils; + + // ==================== Primitive Schemas ==================== + + /** + * Create a string schema + */ + string: () => SchemaWithUtils; + + /** + * Create a string literal schema + */ + stringLiteral: (literal: string) => SchemaWithUtils; + + /** + * Create a boolean literal schema + */ + booleanLiteral: (literal: boolean) => SchemaWithUtils; + + /** + * Create a date schema (parses ISO strings to Date objects) + */ + date: () => SchemaWithUtils; + + /** + * Create a number schema + */ + number: () => SchemaWithUtils; + + /** + * Create a bigint schema + */ + bigint: () => SchemaWithUtils; + + /** + * Create a boolean schema + */ + boolean: () => SchemaWithUtils; + + /** + * Create an any schema (allows any value) + */ + any: () => SchemaWithUtils; + + /** + * Create an unknown schema + */ + unknown: () => SchemaWithUtils; + + /** + * Create a never schema (always fails validation) + */ + never: () => SchemaWithUtils; + + // ==================== Schema Wrappers ==================== + + /** + * Create a lazy schema for recursive types + */ + lazy: (schema: Schema) => SchemaWithUtils; + + /** + * Create a lazy object schema for recursive object types + */ + lazyObject: (schema: Schema) => ObjectSchema; + + // ==================== Type Utilities ==================== + + /** + * Schema type utilities + */ + Schema: { + /** + * Get the TypeScript type reference for a schema type + */ + _getReferenceToType: (args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => ts.TypeNode; + + /** + * Create a schema from a raw expression + */ + _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }) => SchemaWithUtils; + + /** + * Generate if/else statements for handling MaybeValid results + */ + _visitMaybeValid: ( + referenceToMaybeValid: ts.Expression, + visitor: { + valid: (referenceToValue: ts.Expression) => ts.Statement[]; + invalid: (referenceToErrors: ts.Expression) => ts.Statement[]; + } + ) => ts.Statement[]; + }; + + /** + * ObjectSchema type utilities + */ + ObjectSchema: { + /** + * Get the TypeScript type reference for an object schema type + */ + _getReferenceToType: (args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => ts.TypeNode; + }; + + /** + * MaybeValid result type field names + */ + MaybeValid: { + ok: string; + Valid: { + value: string; + }; + Invalid: { + errors: string; + }; + }; + + /** + * ValidationError field names + */ + ValidationError: { + path: string; + message: string; + }; + + // ==================== Runtime Configuration ==================== + + /** + * Get npm dependencies required by this format's runtime + * Returns empty object if no npm dependencies needed + */ + getRuntimeDependencies: () => Record; + + /** + * Get file patterns for runtime files to copy into generated SDK + * Returns null if using npm dependency instead of bundled files + */ + getRuntimeFilePatterns: () => { patterns: string[]; ignore?: string[] } | null; +} + +/** + * Configuration for creating a serialization format + */ +export interface SerializationFormatConfig { + /** + * Function to get a reference to an exported name from the format's module + */ + getReferenceToExport: (args: { manifest: any; exportedName: string }) => Reference; + + /** + * Whether to generate endpoint metadata + */ + generateEndpointMetadata: boolean; +} + From afff2c0a47384089884a3a1c4d90db3ee9d8bb85 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:25:31 -0500 Subject: [PATCH 06/71] integrated initial pipelne into the clis --- .../express/cli/src/ExpressGeneratorCli.ts | 12 ++++++++++-- generators/typescript/sdk/cli/src/SdkGeneratorCli.ts | 12 +++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/generators/typescript/express/cli/src/ExpressGeneratorCli.ts b/generators/typescript/express/cli/src/ExpressGeneratorCli.ts index 7c86d8fa0c47..473460a0cd24 100644 --- a/generators/typescript/express/cli/src/ExpressGeneratorCli.ts +++ b/generators/typescript/express/cli/src/ExpressGeneratorCli.ts @@ -2,7 +2,7 @@ import { Logger } from "@fern-api/logger"; import { FernGeneratorExec } from "@fern-fern/generator-exec-sdk"; import { IntermediateRepresentation } from "@fern-fern/ir-sdk/api"; import { AbstractGeneratorCli } from "@fern-typescript/abstract-generator-cli"; -import { NpmPackage, PersistedTypescriptProject } from "@fern-typescript/commons"; +import { NpmPackage, PersistedTypescriptProject, SerializationPipeline } from "@fern-typescript/commons"; import { GeneratorContext } from "@fern-typescript/contexts"; import { ExpressGenerator } from "@fern-typescript/express-generator"; import { camelCase, upperFirst } from "lodash-es"; @@ -12,7 +12,14 @@ import { ExpressCustomConfigSchema } from "./custom-config/schema/ExpressCustomC export class ExpressGeneratorCli extends AbstractGeneratorCli { protected parseCustomConfig(customConfig: unknown, logger: Logger): ExpressCustomConfig { const parsed = customConfig != null ? ExpressCustomConfigSchema.parse(customConfig) : undefined; - const noSerdeLayer = parsed?.noSerdeLayer ?? false; + + // Resolve serialization format from new option or legacy noSerdeLayer + const serializationFormat = SerializationPipeline.resolveFormatType({ + serializationFormat: parsed?.serializationFormat, + noSerdeLayer: parsed?.noSerdeLayer + }); + const noSerdeLayer = serializationFormat === "none"; + const enableInlineTypes = false; // hardcode, not supported in Express const config = { useBrandedStringAliases: parsed?.useBrandedStringAliases ?? false, @@ -22,6 +29,7 @@ export class ExpressGeneratorCli extends AbstractGeneratorCli { protected parseCustomConfig(customConfig: unknown, logger: Logger): SdkCustomConfig { const parsed = customConfig != null ? SdkCustomConfigSchema.parse(customConfig) : undefined; - const noSerdeLayer = parsed?.noSerdeLayer ?? true; + + // Resolve serialization format from new option or legacy noSerdeLayer + // Note: SDK defaults to noSerdeLayer: true (no serialization) for backward compatibility + const serializationFormat = SerializationPipeline.resolveFormatType({ + serializationFormat: (parsed as any)?.serializationFormat, // TODO: Add to TypescriptCustomConfigSchema + noSerdeLayer: parsed?.noSerdeLayer ?? true + }); + const noSerdeLayer = serializationFormat === "none"; + const config = { useBrandedStringAliases: parsed?.useBrandedStringAliases ?? false, outputSourceFiles: parsed?.outputSourceFiles ?? true, @@ -58,6 +67,7 @@ export class SdkGeneratorCli extends AbstractGeneratorCli { treatUnknownAsAny: parsed?.treatUnknownAsAny ?? false, includeContentHeadersOnFileDownloadResponse: parsed?.includeContentHeadersOnFileDownloadResponse ?? false, noSerdeLayer, + serializationFormat, extraPeerDependencies: parsed?.extraPeerDependencies ?? {}, extraPeerDependenciesMeta: parsed?.extraPeerDependenciesMeta ?? {}, noOptionalProperties: parsed?.noOptionalProperties ?? false, From 1d73f029951a1611a204d08cc48c8eae0a5a46d8 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:25:43 -0500 Subject: [PATCH 07/71] exports --- .../src/serialization-pipeline/index.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/index.ts diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts new file mode 100644 index 000000000000..0629438e36dc --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts @@ -0,0 +1,23 @@ +export { + type AdditionalProperty, + type ObjectLikeSchema, + type ObjectSchema, + type Property, + type RuntimeDependency, + type Schema, + type SchemaOptions, + type SchemaWithUtils, + type SerializationFormat, + type SerializationFormatConfig, + type SingleUnionType, + type UnionArgs +} from "./SerializationFormat"; + +export { + SerializationPipeline, + type SerializationFormatType, + type SerializationPipelineConfig +} from "./SerializationPipeline"; + +export { ZurgFormat, ZURG_MANIFEST, ZodFormat, NoneFormat } from "./formats"; + From 1dea860d2ce2d2be372f722df873bcf4d96f996a Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:26:20 -0500 Subject: [PATCH 08/71] added concrete format implementations --- .../formats/NoneFormat.ts | 123 +++ .../formats/ZodFormat.ts | 771 +++++++++++++++ .../formats/ZurgFormat.ts | 914 ++++++++++++++++++ .../serialization-pipeline/formats/index.ts | 4 + 4 files changed, 1812 insertions(+) create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts new file mode 100644 index 000000000000..39accd2e71a5 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts @@ -0,0 +1,123 @@ +import { ts } from "ts-morph"; + +import { + AdditionalProperty, + ObjectLikeSchema, + ObjectSchema, + Property, + SchemaOptions, + SchemaWithUtils, + SerializationFormat, + SerializationFormatConfig, + Schema, + UnionArgs +} from "../SerializationFormat"; + +/** + * A no-op schema that does nothing - used when serialization is disabled. + */ +const NO_OP_SCHEMA: SchemaWithUtils = { + toExpression: () => ts.factory.createIdentifier("undefined"), + isOptional: false, + isNullable: false, + parse: (raw) => raw, + json: (parsed) => parsed, + parseOrThrow: (raw) => raw, + jsonOrThrow: (parsed) => parsed, + nullable: () => NO_OP_SCHEMA, + optional: () => NO_OP_SCHEMA, + optionalNullable: () => NO_OP_SCHEMA, + transform: () => NO_OP_SCHEMA +}; + +/** + * A no-op object schema + */ +const NO_OP_OBJECT_SCHEMA: ObjectSchema = { + ...NO_OP_SCHEMA, + withParsedProperties: () => NO_OP_OBJECT_SCHEMA as ObjectLikeSchema, + extend: () => NO_OP_OBJECT_SCHEMA, + passthrough: () => NO_OP_OBJECT_SCHEMA +}; + +/** + * NoneFormat - used when serialization is completely disabled. + * All schema builders return no-op schemas that don't generate any code. + */ +export class NoneFormat implements SerializationFormat { + public readonly name = "none" as const; + + constructor(_config: SerializationFormatConfig) { + // No configuration needed for none format + } + + // All schema builders return no-op schemas + public object = (_properties: Property[]): ObjectSchema => NO_OP_OBJECT_SCHEMA; + public objectWithoutOptionalProperties = (_properties: Property[]): ObjectSchema => NO_OP_OBJECT_SCHEMA; + public union = (_args: UnionArgs): ObjectLikeSchema => NO_OP_OBJECT_SCHEMA as ObjectLikeSchema; + public undiscriminatedUnion = (_schemas: Schema[]): SchemaWithUtils => NO_OP_SCHEMA; + public list = (_itemSchema: Schema): SchemaWithUtils => NO_OP_SCHEMA; + public set = (_itemSchema: Schema): SchemaWithUtils => NO_OP_SCHEMA; + public record = (_args: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => NO_OP_SCHEMA; + public enum = (_values: string[]): SchemaWithUtils => NO_OP_SCHEMA; + public string = (): SchemaWithUtils => NO_OP_SCHEMA; + public stringLiteral = (_literal: string): SchemaWithUtils => NO_OP_SCHEMA; + public booleanLiteral = (_literal: boolean): SchemaWithUtils => NO_OP_SCHEMA; + public date = (): SchemaWithUtils => NO_OP_SCHEMA; + public number = (): SchemaWithUtils => NO_OP_SCHEMA; + public bigint = (): SchemaWithUtils => NO_OP_SCHEMA; + public boolean = (): SchemaWithUtils => NO_OP_SCHEMA; + public any = (): SchemaWithUtils => NO_OP_SCHEMA; + public unknown = (): SchemaWithUtils => NO_OP_SCHEMA; + public never = (): SchemaWithUtils => NO_OP_SCHEMA; + public lazy = (_schema: Schema): SchemaWithUtils => NO_OP_SCHEMA; + public lazyObject = (_schema: Schema): ObjectSchema => NO_OP_OBJECT_SCHEMA; + + public Schema = { + _getReferenceToType: (_args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }): ts.TypeNode => { + return ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword); + }, + _fromExpression: (_expression: ts.Expression, _opts?: { isObject: boolean }): SchemaWithUtils => { + return NO_OP_SCHEMA; + }, + _visitMaybeValid: ( + _referenceToMaybeValid: ts.Expression, + _visitor: { + valid: (referenceToValue: ts.Expression) => ts.Statement[]; + invalid: (referenceToErrors: ts.Expression) => ts.Statement[]; + } + ): ts.Statement[] => { + return []; + } + }; + + public ObjectSchema = { + _getReferenceToType: (_args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }): ts.TypeNode => { + return ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword); + } + }; + + public MaybeValid = { + ok: "ok" as const, + Valid: { + value: "value" as const + }, + Invalid: { + errors: "errors" as const + } + }; + + public ValidationError = { + path: "path" as const, + message: "message" as const + }; + + public getRuntimeDependencies(): Record { + return {}; + } + + public getRuntimeFilePatterns(): { patterns: string[]; ignore?: string[] } | null { + return null; // No runtime files needed + } +} + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts new file mode 100644 index 000000000000..bc46a5c116f5 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -0,0 +1,771 @@ +import { ts } from "ts-morph"; + +import { + AdditionalProperty, + ObjectLikeSchema, + ObjectSchema, + Property, + SchemaOptions, + SchemaWithUtils, + SerializationFormat, + SerializationFormatConfig, + Schema, + UnionArgs +} from "../SerializationFormat"; + +/** + * Zod version to use as dependency + */ +const ZOD_VERSION = "^3.23.0"; + +/** + * Base schema implementation for Zod format + */ +interface ZodBaseSchema extends Schema { + toExpression: () => ts.Expression; + isOptional: boolean; + isNullable: boolean; +} + +/** + * Helper to create a property access expression like `z.string()` + */ +function zodCall(methodName: string, args: ts.Expression[] = []): ts.Expression { + return ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("z"), + ts.factory.createIdentifier(methodName) + ), + undefined, + args + ); +} + +/** + * Helper to chain a method call on an expression + */ +function chainMethod(expr: ts.Expression, methodName: string, args: ts.Expression[] = []): ts.Expression { + return ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(expr, ts.factory.createIdentifier(methodName)), + undefined, + args + ); +} + +/** + * ZodFormat - generates Zod schema code. + * Uses Zod as an npm dependency instead of bundled runtime. + */ +export class ZodFormat implements SerializationFormat { + public readonly name = "zod" as const; + + constructor(_config: SerializationFormatConfig) { + // No special configuration needed - Zod is an npm dependency + } + + // ==================== Schema Utilities ==================== + + private getSchemaUtils(baseSchema: ZodBaseSchema): Omit { + return { + nullable: () => this.nullable(baseSchema), + optional: () => this.optional(baseSchema), + optionalNullable: () => this.optionalNullable(baseSchema), + parse: (raw, _opts) => { + // Zod uses .parse() directly + return chainMethod(baseSchema.toExpression(), "parse", [raw]); + }, + json: (parsed, _opts) => { + // For Zod, "json" (serialization) is just identity since Zod doesn't transform + // We return the parsed value as-is - actual serialization happens elsewhere + return parsed; + }, + parseOrThrow: (raw, _opts) => { + // Same as parse() for Zod - it throws by default + return chainMethod(baseSchema.toExpression(), "parse", [raw]); + }, + jsonOrThrow: (parsed, _opts) => { + // Just return the value - no transformation needed + return parsed; + }, + transform: ({ transform, untransform }) => { + // Zod's transform only handles parse direction + // We use .transform() for parse and store untransform separately + const transformedExpr = chainMethod(baseSchema.toExpression(), "transform", [transform]); + const newBase: ZodBaseSchema = { + isOptional: baseSchema.isOptional, + isNullable: baseSchema.isNullable, + toExpression: () => transformedExpr + }; + return { + ...newBase, + ...this.getSchemaUtils(newBase) + }; + } + }; + } + + private nullable(schema: ZodBaseSchema): SchemaWithUtils { + const baseSchema: ZodBaseSchema = { + isOptional: schema.isOptional, + isNullable: true, + toExpression: () => chainMethod(schema.toExpression(), "nullable") + }; + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + + private optional(schema: ZodBaseSchema): SchemaWithUtils { + const baseSchema: ZodBaseSchema = { + isOptional: true, + isNullable: schema.isNullable, + toExpression: () => chainMethod(schema.toExpression(), "optional") + }; + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + + private optionalNullable(schema: ZodBaseSchema): SchemaWithUtils { + const baseSchema: ZodBaseSchema = { + isOptional: true, + isNullable: true, + toExpression: () => chainMethod(chainMethod(schema.toExpression(), "optional"), "nullable") + }; + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + + // ==================== Object-like Utilities ==================== + + private getObjectLikeUtils(_objectLike: ZodBaseSchema): Pick { + return { + withParsedProperties: (additionalProperties: AdditionalProperty[]) => { + // Zod doesn't have direct equivalent of withParsedProperties + // We use .transform() to add computed properties + if (additionalProperties.length === 0) { + return _objectLike as unknown as ObjectLikeSchema; + } + + const transformExpr = ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "parsed")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createObjectLiteralExpression( + [ + ts.factory.createSpreadAssignment(ts.factory.createIdentifier("parsed")), + ...additionalProperties.map((prop) => { + const value = prop.getValue({ + getReferenceToParsed: () => ts.factory.createIdentifier("parsed") + }); + return ts.factory.createPropertyAssignment(prop.key, value); + }) + ], + true + ) + ); + + const transformedExpr = chainMethod(_objectLike.toExpression(), "transform", [transformExpr]); + const newBase: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => transformedExpr + }; + + return { + ...newBase, + ...this.getSchemaUtils(newBase), + ...this.getObjectLikeUtils(newBase) + }; + } + }; + } + + // ==================== Object Utilities ==================== + + private getObjectUtils(objectSchema: ZodBaseSchema): Pick { + return { + extend: (extension) => { + // Zod uses .merge() for extending objects + const extendedExpr = chainMethod(objectSchema.toExpression(), "merge", [extension.toExpression()]); + const newBase: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => extendedExpr + }; + return { + ...newBase, + ...this.getSchemaUtils(newBase), + ...this.getObjectLikeUtils(newBase), + ...this.getObjectUtils(newBase) + }; + }, + passthrough: () => { + // Zod has .passthrough() for allowing extra properties + const passthroughExpr = chainMethod(objectSchema.toExpression(), "passthrough"); + const newBase: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => passthroughExpr + }; + return { + ...newBase, + ...this.getSchemaUtils(newBase), + ...this.getObjectLikeUtils(newBase), + ...this.getObjectUtils(newBase) + }; + } + }; + } + + // ==================== Object Schema Builders ==================== + + public object = (properties: Property[]): ObjectSchema => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => { + const propAssignments = properties.map((prop) => { + // Handle property key renaming + // Zod doesn't have built-in support for raw/parsed key mapping + // We'll use the parsed key and handle renaming in transform if needed + return ts.factory.createPropertyAssignment( + ts.factory.createStringLiteral(prop.key.raw), // Use raw key for parsing + prop.value.toExpression() + ); + }); + + return zodCall("object", [ts.factory.createObjectLiteralExpression(propAssignments, true)]); + } + }; + + // If any properties have different raw/parsed keys, wrap with transform + const needsTransform = properties.some((p) => p.key.raw !== p.key.parsed); + if (needsTransform) { + const transformedBase: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => { + const inner = baseSchema.toExpression(); + const transformExpr = ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "data")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createObjectLiteralExpression( + properties.map((prop) => + ts.factory.createPropertyAssignment( + prop.key.parsed, + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("data"), + prop.key.raw + ) + ) + ), + true + ) + ); + return chainMethod(inner, "transform", [transformExpr]); + } + }; + return { + ...transformedBase, + ...this.getSchemaUtils(transformedBase), + ...this.getObjectLikeUtils(transformedBase), + ...this.getObjectUtils(transformedBase) + }; + } + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + }; + + public objectWithoutOptionalProperties = (properties: Property[]): ObjectSchema => { + // In Zod, we use .strict() to disallow extra properties + // For "without optional properties", we just create a regular object + // The optionality is handled at the property level + return this.object(properties); + }; + + // ==================== Union Schema Builders ==================== + + public union = ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: UnionArgs): ObjectLikeSchema => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => { + // Use z.discriminatedUnion for better performance + const variants = singleUnionTypes.map((variant) => { + // Create an object schema with the discriminant + non-discriminant properties + const discriminantProp = ts.factory.createPropertyAssignment( + ts.factory.createStringLiteral(rawDiscriminant), + zodCall("literal", [ts.factory.createStringLiteral(variant.discriminantValue)]) + ); + + // Get the properties from the non-discriminant schema + // We need to merge them with the discriminant + return chainMethod( + zodCall("object", [ + ts.factory.createObjectLiteralExpression([discriminantProp], false) + ]), + "merge", + [variant.nonDiscriminantProperties.toExpression()] + ); + }); + + return zodCall("discriminatedUnion", [ + ts.factory.createStringLiteral(rawDiscriminant), + ts.factory.createArrayLiteralExpression(variants, true) + ]); + } + }; + + // Handle discriminant renaming if needed + if (parsedDiscriminant !== rawDiscriminant) { + const transformedBase: ZodBaseSchema = { + ...baseSchema, + toExpression: () => { + const inner = baseSchema.toExpression(); + const transformExpr = ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "data")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createObjectLiteralExpression( + [ + ts.factory.createSpreadAssignment(ts.factory.createIdentifier("data")), + ts.factory.createPropertyAssignment( + parsedDiscriminant, + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("data"), + rawDiscriminant + ) + ) + ], + true + ) + ); + return chainMethod(inner, "transform", [transformExpr]); + } + }; + return { + ...transformedBase, + ...this.getSchemaUtils(transformedBase), + ...this.getObjectLikeUtils(transformedBase) + }; + } + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema) + }; + }; + + public undiscriminatedUnion = (schemas: Schema[]): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => { + return zodCall("union", [ + ts.factory.createArrayLiteralExpression( + schemas.map((s) => s.toExpression()), + false + ) + ]); + } + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + // ==================== Collection Schema Builders ==================== + + public list = (itemSchema: Schema): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("array", [itemSchema.toExpression()]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public set = (itemSchema: Schema): SchemaWithUtils => { + // Zod uses z.set() for Set types + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("set", [itemSchema.toExpression()]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public record = ({ keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("record", [keySchema.toExpression(), valueSchema.toExpression()]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + // ==================== Enum Schema Builder ==================== + + public enum = (values: string[]): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + zodCall("enum", [ + ts.factory.createArrayLiteralExpression( + values.map((v) => ts.factory.createStringLiteral(v)), + false + ) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + // ==================== Primitive Schema Builders ==================== + + public string = (): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("string") + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public stringLiteral = (literal: string): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("literal", [ts.factory.createStringLiteral(literal)]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public booleanLiteral = (literal: boolean): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + zodCall("literal", [literal ? ts.factory.createTrue() : ts.factory.createFalse()]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public number = (): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("number") + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public bigint = (): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("bigint") + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public boolean = (): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("boolean") + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public date = (): SchemaWithUtils => { + // Zod's z.date() parses Date objects, but we need to parse ISO strings + // Use z.coerce.date() or z.string().transform() for ISO string parsing + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => { + // Use z.string() with transform to parse ISO strings to Date + return chainMethod( + zodCall("string"), + "transform", + [ + ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "s")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createNewExpression( + ts.factory.createIdentifier("Date"), + undefined, + [ts.factory.createIdentifier("s")] + ) + ) + ] + ); + } + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public any = (): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: true, // any includes null + toExpression: () => zodCall("any") + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public unknown = (): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: true, // unknown can be undefined + isNullable: false, + toExpression: () => zodCall("unknown") + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public never = (): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => zodCall("never") + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + // ==================== Lazy Schema Builders ==================== + + public lazy = (schema: Schema): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: schema.isOptional, + isNullable: schema.isNullable, + toExpression: () => + zodCall("lazy", [ + ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + schema.toExpression() + ) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; + + public lazyObject = (schema: Schema): ObjectSchema => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: schema.isNullable, + toExpression: () => + zodCall("lazy", [ + ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + schema.toExpression() + ) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + }; + + // ==================== Type Utilities ==================== + + public Schema = { + _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + // For Zod, we use z.ZodType + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodType"), + [parsedShape, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), rawShape] + ); + }, + + _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SchemaWithUtils => { + const baseSchema: ZodBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => expression + }; + if (opts?.isObject) { + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + } as SchemaWithUtils; + } + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }, + + _visitMaybeValid: ( + referenceToMaybeValid: ts.Expression, + visitor: { + valid: (referenceToValue: ts.Expression) => ts.Statement[]; + invalid: (referenceToErrors: ts.Expression) => ts.Statement[]; + } + ): ts.Statement[] => { + // For Zod, safeParse returns { success: boolean, data?, error? } + // We generate: if (result.success) { valid(result.data) } else { invalid(result.error) } + return [ + ts.factory.createIfStatement( + ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "success"), + ts.factory.createBlock( + visitor.valid( + ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "data") + ), + true + ), + ts.factory.createBlock( + visitor.invalid( + ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "error") + ), + true + ) + ) + ]; + } + }; + + public ObjectSchema = { + _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + // For Zod object schemas + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodObject"), + [ + ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), // shape + ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral("strip")), // unknownKeys + ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), // catchall + parsedShape, + rawShape + ] + ); + } + }; + + // Zod's safeParse result field names + public MaybeValid = { + ok: "success" as const, + Valid: { + value: "data" as const + }, + Invalid: { + errors: "error" as const + } + }; + + // Zod's error field names + public ValidationError = { + path: "path" as const, + message: "message" as const + }; + + // ==================== Runtime Configuration ==================== + + public getRuntimeDependencies(): Record { + return { + zod: ZOD_VERSION + }; + } + + public getRuntimeFilePatterns(): { patterns: string[]; ignore?: string[] } | null { + // Zod uses npm dependency, no bundled files needed + return null; + } +} + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts new file mode 100644 index 000000000000..6b7e86b14f00 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -0,0 +1,914 @@ +import { ts } from "ts-morph"; + +import { Reference } from "../../referencing"; +import { CoreUtility } from "../../core-utilities/CoreUtility"; +import { + AdditionalProperty, + ObjectLikeSchema, + ObjectSchema, + Property, + SchemaOptions, + SchemaWithUtils, + SerializationFormat, + SerializationFormatConfig, + SingleUnionType, + UnionArgs, + Schema +} from "../SerializationFormat"; + +/** + * Manifest for the Zurg runtime files + */ +export const ZURG_MANIFEST: CoreUtility.Manifest = { + name: "schemas", + pathInCoreUtilities: { nameOnDisk: "schemas", exportDeclaration: { namespaceExport: "serialization" } }, + getFilesPatterns: () => { + return { patterns: ["src/core/schemas/**", "tests/unit/schemas/**"] }; + } +}; + +/** + * Base schema implementation for Zurg format + */ +interface ZurgBaseSchema extends Schema { + toExpression: () => ts.Expression; + isOptional: boolean; + isNullable: boolean; +} + +/** + * Zurg implementation of the SerializationFormat protocol. + * This generates TypeScript AST that uses Zurg's runtime schema library. + */ +export class ZurgFormat implements SerializationFormat { + public readonly name = "zurg" as const; + + private getReferenceToExport: (args: { manifest: CoreUtility.Manifest; exportedName: string }) => Reference; + private generateEndpointMetadata: boolean; + + constructor(config: SerializationFormatConfig) { + this.getReferenceToExport = config.getReferenceToExport; + this.generateEndpointMetadata = config.generateEndpointMetadata; + } + + // ==================== Helper to get reference to exported name ==================== + + private withExportedName any>( + exportedName: string, + run: (reference: Reference) => F + ): F { + const wrapper = (...args: Parameters): ReturnType => { + const reference = this.getReferenceToExport({ + manifest: ZURG_MANIFEST, + exportedName + }); + return run(reference)(...args); + }; + return wrapper as F; + } + + // ==================== Schema Utilities ==================== + + private getSchemaUtils(baseSchema: ZurgBaseSchema): Omit { + return { + nullable: () => this.nullable(baseSchema), + optional: () => this.optional(baseSchema), + optionalNullable: () => this.optionalNullable(baseSchema), + parse: (raw, opts) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "parse"), + undefined, + [raw, ...this.constructSchemaOptionsArgs(opts)] + ), + json: (parsed, opts) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "json"), + undefined, + [parsed, ...this.constructSchemaOptionsArgs(opts)] + ), + parseOrThrow: (raw, opts) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "parseOrThrow"), + undefined, + [raw, ...this.constructSchemaOptionsArgs(opts)] + ), + jsonOrThrow: (parsed, opts) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "jsonOrThrow"), + undefined, + [parsed, ...this.constructSchemaOptionsArgs(opts)] + ), + transform: ({ + newShape, + transform, + untransform + }: { + newShape: ts.TypeNode | undefined; + transform: ts.Expression; + untransform: ts.Expression; + }) => + this.transform(baseSchema, { + newShape, + transformer: this.Schema._fromTransformers({ transform, untransform }) + }) + }; + } + + private constructSchemaOptionsArgs(schemaOptions: Required): ts.Expression[] { + const properties: ts.ObjectLiteralElementLike[] = []; + + if (schemaOptions.unrecognizedObjectKeys !== "fail") { + properties.push( + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("unrecognizedObjectKeys"), + ts.factory.createStringLiteral(schemaOptions.unrecognizedObjectKeys) + ) + ); + } + if (schemaOptions.allowUnrecognizedUnionMembers) { + properties.push( + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("allowUnrecognizedUnionMembers"), + ts.factory.createTrue() + ) + ); + } + if (schemaOptions.allowUnrecognizedEnumValues) { + properties.push( + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("allowUnrecognizedEnumValues"), + ts.factory.createTrue() + ) + ); + } + if (schemaOptions.skipValidation) { + properties.push( + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("skipValidation"), + ts.factory.createTrue() + ) + ); + } + if (schemaOptions.omitUndefined) { + properties.push( + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("omitUndefined"), + ts.factory.createTrue() + ) + ); + } + if (schemaOptions.breadcrumbsPrefix.length > 0) { + properties.push( + ts.factory.createPropertyAssignment( + ts.factory.createIdentifier("breadcrumbsPrefix"), + ts.factory.createArrayLiteralExpression( + schemaOptions.breadcrumbsPrefix.map((breadcrumb) => ts.factory.createStringLiteral(breadcrumb)) + ) + ) + ); + } + + if (properties.length > 0) { + return [ts.factory.createObjectLiteralExpression(properties)]; + } else { + return []; + } + } + + private nullable(schema: ZurgBaseSchema): SchemaWithUtils { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: true, + toExpression: () => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + schema.toExpression(), + ts.factory.createIdentifier("nullable") + ), + undefined, + [] + ) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + + private optional(schema: ZurgBaseSchema): SchemaWithUtils { + const baseSchema: ZurgBaseSchema = { + isOptional: true, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + schema.toExpression(), + ts.factory.createIdentifier("optional") + ), + undefined, + [] + ) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + + private optionalNullable(schema: ZurgBaseSchema): SchemaWithUtils { + const baseSchema: ZurgBaseSchema = { + isOptional: true, + isNullable: true, + toExpression: () => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + schema.toExpression(), + ts.factory.createIdentifier("optionalNullable") + ), + undefined, + [] + ) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + + private transform( + schema: ZurgBaseSchema, + { newShape, transformer }: { newShape: ts.TypeNode | undefined; transformer: ZurgBaseSchema } + ): SchemaWithUtils { + const baseSchema: ZurgBaseSchema = { + isOptional: transformer.isOptional, + isNullable: transformer.isNullable, + toExpression: () => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + schema.toExpression(), + ts.factory.createIdentifier("transform") + ), + newShape != null ? [newShape] : undefined, + [transformer.toExpression()] + ) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + + // ==================== Object-like Utilities ==================== + + private getObjectLikeUtils(objectLike: ZurgBaseSchema): Pick { + return { + withParsedProperties: (additionalProperties: AdditionalProperty[]) => + this.withParsedProperties(objectLike, additionalProperties) + }; + } + + private withParsedProperties( + objectLike: ZurgBaseSchema, + additionalProperties: AdditionalProperty[] + ): ObjectLikeSchema { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + objectLike.toExpression(), + ts.factory.createIdentifier("withParsedProperties") + ), + undefined, + [ + ts.factory.createObjectLiteralExpression( + additionalProperties.map((property) => { + const parsedIdentifier = ts.factory.createIdentifier("parsed"); + const context = { didAccessParsed: false }; + const getReferenceToParsed = () => { + context.didAccessParsed = true; + return parsedIdentifier; + }; + + const value = property.getValue({ getReferenceToParsed }); + + return ts.factory.createPropertyAssignment( + property.key, + context.didAccessParsed + ? ts.factory.createArrowFunction( + undefined, + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + parsedIdentifier + ) + ], + undefined, + undefined, + value + ) + : ts.isCallExpression(value) + ? ts.factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + undefined, + value + ) + : value + ); + }), + true + ) + ] + ) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema) + }; + } + + // ==================== Object Utilities ==================== + + private getObjectUtils(objectSchema: ZurgBaseSchema): Pick { + return { + extend: (extension) => this.extend(objectSchema, extension as ZurgBaseSchema), + passthrough: () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + objectSchema.toExpression(), + ts.factory.createIdentifier("passthrough") + ), + undefined, + [] + ) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + } + }; + } + + private extend(objectSchema: ZurgBaseSchema, extension: ZurgBaseSchema): ObjectSchema { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + objectSchema.toExpression(), + ts.factory.createIdentifier("extend") + ), + undefined, + [extension.toExpression()] + ) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + } + + // ==================== Object Schema Builders ==================== + + public object = this.withExportedName("object", (object) => (properties: Property[]): ObjectSchema => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(object.getExpression(), undefined, [ + this.constructObjectLiteralForProperties(properties) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + }); + + public objectWithoutOptionalProperties = this.withExportedName( + "objectWithoutOptionalProperties", + (objectWithoutOptionalProperties) => + (properties: Property[]): ObjectSchema => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(objectWithoutOptionalProperties.getExpression(), undefined, [ + this.constructObjectLiteralForProperties(properties) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + } + ); + + private constructObjectLiteralForProperties(properties: Property[]): ts.ObjectLiteralExpression { + return ts.factory.createObjectLiteralExpression( + properties.map((property) => { + let value = property.value.toExpression(); + if (property.key.raw !== property.key.parsed) { + value = this.property(property.key.raw, value); + } + return ts.factory.createPropertyAssignment(ts.factory.createStringLiteral(property.key.parsed), value); + }), + true + ); + } + + private property = this.withExportedName( + "property", + (property) => + (rawValue: string, value: ts.Expression): ts.Expression => { + return ts.factory.createCallExpression(property.getExpression(), undefined, [ + ts.factory.createStringLiteral(rawValue), + value + ]); + } + ); + + // ==================== Union Schema Builders ==================== + + public union = this.withExportedName( + "union", + (union: Reference) => + ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: UnionArgs): ObjectLikeSchema => { + const discriminantArgument = + parsedDiscriminant === rawDiscriminant + ? ts.factory.createStringLiteral(parsedDiscriminant) + : this.discriminant({ parsedDiscriminant, rawDiscriminant }); + + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(union.getExpression(), undefined, [ + discriminantArgument, + ts.factory.createObjectLiteralExpression( + singleUnionTypes.map((singleUnionType) => + ts.factory.createPropertyAssignment( + ts.factory.createStringLiteral(singleUnionType.discriminantValue), + singleUnionType.nonDiscriminantProperties.toExpression() + ) + ), + true + ) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema) + }; + } + ); + + private discriminant = this.withExportedName( + "discriminant", + (discriminant) => + ({ + parsedDiscriminant, + rawDiscriminant + }: { + parsedDiscriminant: string; + rawDiscriminant: string; + }): ts.Expression => { + return ts.factory.createCallExpression(discriminant.getExpression(), undefined, [ + ts.factory.createStringLiteral(parsedDiscriminant), + ts.factory.createStringLiteral(rawDiscriminant) + ]); + } + ); + + public undiscriminatedUnion = this.withExportedName( + "undiscriminatedUnion", + (undiscriminatedUnion: Reference) => (schemas: Schema[]) => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(undiscriminatedUnion.getExpression(), undefined, [ + ts.factory.createArrayLiteralExpression(schemas.map((schema) => schema.toExpression())) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + ); + + // ==================== Collection Schema Builders ==================== + + public list = this.withExportedName("list", (list: Reference) => (itemSchema: Schema) => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(list.getExpression(), undefined, [itemSchema.toExpression()]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public set = this.withExportedName("set", (set: Reference) => (itemSchema: Schema) => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(set.getExpression(), undefined, [itemSchema.toExpression()]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public record = this.withExportedName( + "record", + (record: Reference) => + ({ keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }) => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(record.getExpression(), undefined, [ + keySchema.toExpression(), + valueSchema.toExpression() + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + ); + + // ==================== Enum Schema Builder ==================== + + public enum = this.withExportedName("enum_", (enum_: Reference) => (values: string[]) => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(enum_.getExpression(), undefined, [ + ts.factory.createArrayLiteralExpression( + values.map((value) => ts.factory.createStringLiteral(value)) + ) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + // ==================== Primitive Schema Builders ==================== + + public string = this.withExportedName("string", (string: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => ts.factory.createCallExpression(string.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public stringLiteral = this.withExportedName("stringLiteral", (stringLiteral: Reference) => (literal: string) => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(stringLiteral.getExpression(), undefined, [ + ts.factory.createStringLiteral(literal) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public booleanLiteral = this.withExportedName( + "booleanLiteral", + (booleanLiteral: Reference) => (literal: boolean) => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createCallExpression(booleanLiteral.getExpression(), undefined, [ + literal ? ts.factory.createTrue() : ts.factory.createFalse() + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + } + ); + + public number = this.withExportedName("number", (number: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => ts.factory.createCallExpression(number.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public bigint = this.withExportedName("bigint", (bigint: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => ts.factory.createCallExpression(bigint.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public boolean = this.withExportedName("boolean", (boolean: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => ts.factory.createCallExpression(boolean.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public date = this.withExportedName("date", (date: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => ts.factory.createCallExpression(date.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public any = this.withExportedName("any", (any: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: true, + toExpression: () => ts.factory.createCallExpression(any.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public unknown = this.withExportedName("unknown", (unknown: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: true, + isNullable: false, + toExpression: () => ts.factory.createCallExpression(unknown.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public never = this.withExportedName("never", (never: Reference) => () => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => ts.factory.createCallExpression(never.getExpression(), undefined, undefined) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + // ==================== Lazy Schema Builders ==================== + + public lazy = this.withExportedName("lazy", (lazy) => (schema: Schema): SchemaWithUtils => { + const baseSchema: ZurgBaseSchema = { + isOptional: schema.isOptional, + isNullable: schema.isNullable, + toExpression: () => + ts.factory.createCallExpression(lazy.getExpression(), undefined, [ + ts.factory.createArrowFunction([], undefined, [], undefined, undefined, schema.toExpression()) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }); + + public lazyObject = this.withExportedName( + "lazyObject", + (lazyObject) => + (schema: Schema): ObjectSchema => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: schema.isNullable, + toExpression: () => + ts.factory.createCallExpression(lazyObject.getExpression(), undefined, [ + ts.factory.createArrowFunction( + [], + undefined, + [], + undefined, + undefined, + schema.toExpression() + ) + ]) + }; + + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + } + ); + + // ==================== Type Utilities ==================== + + public Schema = { + _getReferenceToType: this.withExportedName( + "Schema", + (Schema) => + ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => + ts.factory.createTypeReferenceNode(Schema.getEntityName(), [rawShape, parsedShape]) + ), + + _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SchemaWithUtils => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => expression + }; + if (opts?.isObject) { + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + } as SchemaWithUtils; + } + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }, + + _fromTransformers: ({ + transform, + untransform + }: { + transform: ts.Expression; + untransform: ts.Expression; + }): ZurgBaseSchema => { + return { + isOptional: false, + isNullable: false, + toExpression: () => + ts.factory.createObjectLiteralExpression( + [ + ts.factory.createPropertyAssignment("transform", transform), + ts.factory.createPropertyAssignment("untransform", untransform) + ], + true + ) + }; + }, + + _visitMaybeValid: ( + referenceToMaybeValid: ts.Expression, + visitor: { + valid: (referenceToValue: ts.Expression) => ts.Statement[]; + invalid: (referenceToErrors: ts.Expression) => ts.Statement[]; + } + ): ts.Statement[] => { + return [ + ts.factory.createIfStatement( + ts.factory.createPropertyAccessExpression(referenceToMaybeValid, this.MaybeValid.ok), + ts.factory.createBlock( + visitor.valid( + ts.factory.createPropertyAccessExpression( + referenceToMaybeValid, + this.MaybeValid.Valid.value + ) + ), + true + ), + ts.factory.createBlock( + visitor.invalid( + ts.factory.createPropertyAccessExpression( + referenceToMaybeValid, + this.MaybeValid.Invalid.errors + ) + ), + true + ) + ) + ]; + } + }; + + public ObjectSchema = { + _getReferenceToType: this.withExportedName( + "ObjectSchema", + (ObjectSchema) => + ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => + ts.factory.createTypeReferenceNode(ObjectSchema.getEntityName(), [rawShape, parsedShape]) + ) + }; + + public MaybeValid = { + ok: "ok" as const, + Valid: { + value: "value" as const + }, + Invalid: { + errors: "errors" as const + } + }; + + public ValidationError = { + path: "path" as const, + message: "message" as const + }; + + // ==================== Runtime Configuration ==================== + + public getRuntimeDependencies(): Record { + // Zurg bundles its own runtime, no npm dependencies needed + return {}; + } + + public getRuntimeFilePatterns(): { patterns: string[]; ignore?: string[] } | null { + // Return the file patterns for Zurg runtime to be copied + return { patterns: ["src/core/schemas/**", "tests/unit/schemas/**"] }; + } +} + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts new file mode 100644 index 000000000000..1286fd8ad8d0 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts @@ -0,0 +1,4 @@ +export { ZurgFormat, ZURG_MANIFEST } from "./ZurgFormat"; +export { ZodFormat } from "./ZodFormat"; +export { NoneFormat } from "./NoneFormat"; + From 384a71655ddfd439df50ec6a0f7e9bacb9a6bd49 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:26:44 -0500 Subject: [PATCH 09/71] added tests with benchmarks --- .../__tests__/SerializationPipeline.test.ts | 232 ++++++++ .../__tests__/ZodFormat.test.ts | 360 ++++++++++++ .../__tests__/ZurgBaseline.test.ts | 490 +++++++++++++++++ .../__tests__/ZurgFormat.test.ts | 515 ++++++++++++++++++ .../__snapshots__/ZodFormat.test.ts.snap | 113 ++++ .../__snapshots__/ZurgBaseline.test.ts.snap | 165 ++++++ .../__tests__/benchmark.test.ts | 484 ++++++++++++++++ 7 files changed, 2359 insertions(+) create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts new file mode 100644 index 000000000000..ec2f5cf42bea --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts @@ -0,0 +1,232 @@ +import { describe, expect, it } from "vitest"; +import { ts } from "ts-morph"; + +import { Reference } from "../../referencing"; +import { SerializationPipeline } from "../SerializationPipeline"; +import { ZurgFormat } from "../formats/ZurgFormat"; +import { ZodFormat } from "../formats/ZodFormat"; +import { NoneFormat } from "../formats/NoneFormat"; + +/** + * Create a mock reference for testing + */ +function createMockReference(exportedName: string): Reference { + return { + getExpression: () => { + return ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + }, + getTypeNode: () => { + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ), + undefined + ); + }, + getEntityName: () => { + return ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + } + }; +} + +describe("SerializationPipeline", () => { + const baseConfig = { + getReferenceToExport: ({ exportedName }: { manifest: any; exportedName: string }) => + createMockReference(exportedName), + generateEndpointMetadata: false + }; + + describe("format creation", () => { + it("creates ZurgFormat for 'default'", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "default" + }); + + expect(pipeline.getFormat()).toBeInstanceOf(ZurgFormat); + expect(pipeline.getFormatType()).toBe("default"); + expect(pipeline.isEnabled()).toBe(true); + }); + + it("creates ZurgFormat for 'zurg'", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "zurg" + }); + + expect(pipeline.getFormat()).toBeInstanceOf(ZurgFormat); + expect(pipeline.getFormatType()).toBe("zurg"); + expect(pipeline.isEnabled()).toBe(true); + }); + + it("creates NoneFormat for 'none'", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "none" + }); + + expect(pipeline.getFormat()).toBeInstanceOf(NoneFormat); + expect(pipeline.getFormatType()).toBe("none"); + expect(pipeline.isEnabled()).toBe(false); + }); + + it("creates ZodFormat for 'zod'", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "zod" + }); + + expect(pipeline.getFormat()).toBeInstanceOf(ZodFormat); + expect(pipeline.getFormatType()).toBe("zod"); + expect(pipeline.isEnabled()).toBe(true); + }); + }); + + describe("resolveFormatType", () => { + it("returns explicit serializationFormat when provided", () => { + expect( + SerializationPipeline.resolveFormatType({ + serializationFormat: "zurg" + }) + ).toBe("zurg"); + + expect( + SerializationPipeline.resolveFormatType({ + serializationFormat: "none" + }) + ).toBe("none"); + + expect( + SerializationPipeline.resolveFormatType({ + serializationFormat: "zod" + }) + ).toBe("zod"); + }); + + it("returns 'none' when noSerdeLayer is true", () => { + expect( + SerializationPipeline.resolveFormatType({ + noSerdeLayer: true + }) + ).toBe("none"); + }); + + it("returns 'default' when noSerdeLayer is false", () => { + expect( + SerializationPipeline.resolveFormatType({ + noSerdeLayer: false + }) + ).toBe("default"); + }); + + it("returns 'default' when nothing is specified", () => { + expect(SerializationPipeline.resolveFormatType({})).toBe("default"); + }); + + it("serializationFormat takes precedence over noSerdeLayer", () => { + // Even with noSerdeLayer: true, explicit format wins + expect( + SerializationPipeline.resolveFormatType({ + serializationFormat: "zurg", + noSerdeLayer: true + }) + ).toBe("zurg"); + + // And vice versa + expect( + SerializationPipeline.resolveFormatType({ + serializationFormat: "none", + noSerdeLayer: false + }) + ).toBe("none"); + }); + }); + + describe("runtime configuration", () => { + it("ZurgFormat returns no npm dependencies", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "zurg" + }); + + expect(pipeline.getRuntimeDependencies()).toEqual({}); + }); + + it("ZurgFormat returns file patterns for bundled runtime", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "zurg" + }); + + const patterns = pipeline.getRuntimeFilePatterns(); + expect(patterns).not.toBeNull(); + expect(patterns?.patterns).toContain("src/core/schemas/**"); + }); + + it("NoneFormat returns no dependencies and no files", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "none" + }); + + expect(pipeline.getRuntimeDependencies()).toEqual({}); + expect(pipeline.getRuntimeFilePatterns()).toBeNull(); + }); + + it("ZodFormat returns zod npm dependency and no files", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "zod" + }); + + const deps = pipeline.getRuntimeDependencies(); + expect(deps).toHaveProperty("zod"); + expect(pipeline.getRuntimeFilePatterns()).toBeNull(); + }); + }); + + describe("schema generation through pipeline", () => { + it("ZurgFormat generates valid schema expressions", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "zurg" + }); + + const format = pipeline.getFormat(); + const schema = format.object([ + { key: { parsed: "name", raw: "name" }, value: format.string() } + ]); + + const expr = schema.toExpression(); + expect(expr).toBeDefined(); + + // Verify it's a valid call expression + expect(ts.isCallExpression(expr)).toBe(true); + }); + + it("NoneFormat generates no-op expressions", () => { + const pipeline = new SerializationPipeline({ + ...baseConfig, + format: "none" + }); + + const format = pipeline.getFormat(); + const schema = format.object([ + { key: { parsed: "name", raw: "name" }, value: format.string() } + ]); + + const expr = schema.toExpression(); + expect(expr).toBeDefined(); + // NoneFormat returns identifier "undefined" + expect(ts.isIdentifier(expr)).toBe(true); + }); + }); +}); + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts new file mode 100644 index 000000000000..b020aeb66b30 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -0,0 +1,360 @@ +import { describe, expect, it } from "vitest"; +import { ts } from "ts-morph"; + +import { Reference } from "../../referencing"; +import { ZodFormat } from "../formats/ZodFormat"; + +/** + * Helper to print TypeScript AST to string for comparison + */ +function printNode(node: ts.Node): string { + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const sourceFile = ts.createSourceFile("test.ts", "", ts.ScriptTarget.Latest, false, ts.ScriptKind.TS); + return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile); +} + +/** + * Create a mock reference for testing + */ +function createMockReference(exportedName: string): Reference { + return { + getExpression: () => { + return ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("z"), + ts.factory.createIdentifier(exportedName) + ); + }, + getTypeNode: () => { + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName( + ts.factory.createIdentifier("z"), + ts.factory.createIdentifier(exportedName) + ), + undefined + ); + }, + getEntityName: () => { + return ts.factory.createQualifiedName( + ts.factory.createIdentifier("z"), + ts.factory.createIdentifier(exportedName) + ); + } + }; +} + +/** + * Create a ZodFormat instance for testing + */ +function createZod(): ZodFormat { + return new ZodFormat({ + getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), + generateEndpointMetadata: false + }); +} + +describe("ZodFormat AST Generation", () => { + const zod = createZod(); + + describe("Primitive Schemas", () => { + it("string() generates z.string()", () => { + const schema = zod.string(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("number() generates z.number()", () => { + const schema = zod.number(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("boolean() generates z.boolean()", () => { + const schema = zod.boolean(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("bigint() generates z.bigint()", () => { + const schema = zod.bigint(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("date() generates z.string().transform()", () => { + const schema = zod.date(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("any() generates z.any()", () => { + const schema = zod.any(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("unknown() generates z.unknown()", () => { + const schema = zod.unknown(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("never() generates z.never()", () => { + const schema = zod.never(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Literal Schemas", () => { + it("stringLiteral() generates z.literal()", () => { + const schema = zod.stringLiteral("hello"); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("booleanLiteral(true) generates z.literal(true)", () => { + const schema = zod.booleanLiteral(true); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("booleanLiteral(false) generates z.literal(false)", () => { + const schema = zod.booleanLiteral(false); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Object Schemas", () => { + it("empty object generates z.object({})", () => { + const schema = zod.object([]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with same raw/parsed keys generates z.object()", () => { + const schema = zod.object([ + { key: { parsed: "name", raw: "name" }, value: zod.string() }, + { key: { parsed: "age", raw: "age" }, value: zod.number() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with different raw/parsed keys generates transform", () => { + const schema = zod.object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zod.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zod.string() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with optional property", () => { + const schema = zod.object([ + { key: { parsed: "name", raw: "name" }, value: zod.string() }, + { key: { parsed: "nickname", raw: "nickname" }, value: zod.string().optional() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with nullable property", () => { + const schema = zod.object([ + { key: { parsed: "name", raw: "name" }, value: zod.string().nullable() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object.passthrough()", () => { + const schema = zod.object([ + { key: { parsed: "id", raw: "id" }, value: zod.string() } + ]).passthrough(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Enum Schemas", () => { + it("enum generates z.enum()", () => { + const schema = zod.enum(["ACTIVE", "INACTIVE", "PENDING"]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Collection Schemas", () => { + it("list() generates z.array()", () => { + const schema = zod.list(zod.string()); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("set() generates z.set()", () => { + const schema = zod.set(zod.number()); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("record() generates z.record()", () => { + const schema = zod.record({ + keySchema: zod.string(), + valueSchema: zod.number() + }); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("nested list generates z.array(z.array())", () => { + const schema = zod.list(zod.list(zod.string())); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Union Schemas", () => { + it("discriminated union generates z.discriminatedUnion()", () => { + const schema = zod.union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zod.object([ + { key: { parsed: "breed", raw: "breed" }, value: zod.string() } + ]) + }, + { + discriminantValue: "cat", + nonDiscriminantProperties: zod.object([ + { key: { parsed: "indoor", raw: "indoor" }, value: zod.boolean() } + ]) + } + ] + }); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("undiscriminatedUnion generates z.union()", () => { + const schema = zod.undiscriminatedUnion([zod.string(), zod.number(), zod.boolean()]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Lazy Schemas", () => { + it("lazy() generates z.lazy()", () => { + const schema = zod.lazy(zod.string()); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("lazyObject() generates z.lazy()", () => { + const schema = zod.lazyObject( + zod.object([{ key: { parsed: "id", raw: "id" }, value: zod.string() }]) + ); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Schema Modifiers", () => { + it("optional() generates .optional()", () => { + const schema = zod.string().optional(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("nullable() generates .nullable()", () => { + const schema = zod.string().nullable(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("optionalNullable() generates .optional().nullable()", () => { + const schema = zod.string().optionalNullable(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Schema Operations", () => { + it("parse() generates .parse()", () => { + const schema = zod.string(); + const rawExpr = ts.factory.createIdentifier("rawValue"); + const parseExpr = schema.parse(rawExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + const ast = printNode(parseExpr); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Type References", () => { + it("Schema._getReferenceToType generates z.ZodType", () => { + const rawShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + const parsedShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + const typeNode = zod.Schema._getReferenceToType({ rawShape, parsedShape }); + const ast = printNode(typeNode); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("MaybeValid Visitor", () => { + it("_visitMaybeValid generates if/else with success/data/error", () => { + const maybeValidRef = ts.factory.createIdentifier("result"); + const statements = zod.Schema._visitMaybeValid(maybeValidRef, { + valid: (valueRef) => [ + ts.factory.createExpressionStatement( + ts.factory.createCallExpression( + ts.factory.createIdentifier("console.log"), + undefined, + [valueRef] + ) + ) + ], + invalid: (errorsRef) => [ + ts.factory.createThrowStatement( + ts.factory.createNewExpression( + ts.factory.createIdentifier("Error"), + undefined, + [errorsRef] + ) + ) + ] + }); + const block = ts.factory.createBlock(statements, true); + const ast = printNode(block); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Field names", () => { + it("MaybeValid field names use Zod conventions", () => { + expect(zod.MaybeValid.ok).toBe("success"); + expect(zod.MaybeValid.Valid.value).toBe("data"); + expect(zod.MaybeValid.Invalid.errors).toBe("error"); + }); + }); + + describe("Runtime Configuration", () => { + it("returns zod as npm dependency", () => { + const deps = zod.getRuntimeDependencies(); + expect(deps).toHaveProperty("zod"); + expect(deps.zod).toMatch(/^\^3\./); + }); + + it("returns null for runtime file patterns (uses npm)", () => { + const patterns = zod.getRuntimeFilePatterns(); + expect(patterns).toBeNull(); + }); + }); +}); + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts new file mode 100644 index 000000000000..02e42f4a3127 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts @@ -0,0 +1,490 @@ +import { describe, expect, it } from "vitest"; +import { ts } from "ts-morph"; + +import { Reference } from "../../referencing"; +import { ZurgImpl, MANIFEST as ZURG_MANIFEST } from "../../core-utilities/Zurg"; + +/** + * Helper to print TypeScript AST to string for snapshot comparison + */ +function printNode(node: ts.Node): string { + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const sourceFile = ts.createSourceFile("test.ts", "", ts.ScriptTarget.Latest, false, ts.ScriptKind.TS); + return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile); +} + +/** + * Create a mock reference that simulates what the real system does. + * This creates references like `serialization.object(...)` etc. + */ +function createMockReference(exportedName: string): Reference { + return { + getExpression: () => { + return ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + }, + getTypeNode: () => { + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ), + undefined + ); + }, + getEntityName: () => { + return ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + } + }; +} + +/** + * Create a ZurgImpl instance for testing + */ +function createZurg(): ZurgImpl { + return new ZurgImpl({ + getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), + generateEndpointMetadata: false + }); +} + +describe("ZurgImpl AST Generation Baseline", () => { + const zurg = createZurg(); + + describe("Primitive Schemas", () => { + it("string() generates correct AST", () => { + const schema = zurg.string(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("number() generates correct AST", () => { + const schema = zurg.number(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("boolean() generates correct AST", () => { + const schema = zurg.boolean(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("bigint() generates correct AST", () => { + const schema = zurg.bigint(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("date() generates correct AST", () => { + const schema = zurg.date(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("any() generates correct AST", () => { + const schema = zurg.any(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("unknown() generates correct AST", () => { + const schema = zurg.unknown(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("never() generates correct AST", () => { + const schema = zurg.never(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Literal Schemas", () => { + it("stringLiteral() generates correct AST", () => { + const schema = zurg.stringLiteral("hello"); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("booleanLiteral(true) generates correct AST", () => { + const schema = zurg.booleanLiteral(true); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("booleanLiteral(false) generates correct AST", () => { + const schema = zurg.booleanLiteral(false); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Object Schemas", () => { + it("empty object generates correct AST", () => { + const schema = zurg.object([]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with same raw/parsed keys generates correct AST", () => { + const schema = zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with different raw/parsed keys generates correct AST", () => { + const schema = zurg.object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with optional property generates correct AST", () => { + const schema = zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "nickname", raw: "nickname" }, value: zurg.string().optional() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object with nullable property generates correct AST", () => { + const schema = zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string().nullable() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("objectWithoutOptionalProperties generates correct AST", () => { + const schema = zurg.objectWithoutOptionalProperties([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object.extend() generates correct AST", () => { + const baseSchema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() } + ]); + const extendedSchema = baseSchema.extend( + zurg.object([{ key: { parsed: "name", raw: "name" }, value: zurg.string() }]) + ); + const ast = printNode(extendedSchema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("object.passthrough() generates correct AST", () => { + const schema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() } + ]).passthrough(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Enum Schemas", () => { + it("enum with single value generates correct AST", () => { + const schema = zurg.enum(["ACTIVE"]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("enum with multiple values generates correct AST", () => { + const schema = zurg.enum(["ACTIVE", "INACTIVE", "PENDING"]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Collection Schemas", () => { + it("list() generates correct AST", () => { + const schema = zurg.list(zurg.string()); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("set() generates correct AST", () => { + const schema = zurg.set(zurg.number()); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("record() generates correct AST", () => { + const schema = zurg.record({ + keySchema: zurg.string(), + valueSchema: zurg.number() + }); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("nested list generates correct AST", () => { + const schema = zurg.list(zurg.list(zurg.string())); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Union Schemas", () => { + it("discriminated union generates correct AST", () => { + const schema = zurg.union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "breed", raw: "breed" }, value: zurg.string() } + ]) + }, + { + discriminantValue: "cat", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "indoor", raw: "indoor" }, value: zurg.boolean() } + ]) + } + ] + }); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("union with different raw/parsed discriminant generates correct AST", () => { + const schema = zurg.union({ + parsedDiscriminant: "animalType", + rawDiscriminant: "animal_type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurg.object([]) + } + ] + }); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("undiscriminatedUnion generates correct AST", () => { + const schema = zurg.undiscriminatedUnion([zurg.string(), zurg.number(), zurg.boolean()]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Lazy Schemas (for recursion)", () => { + it("lazy() generates correct AST", () => { + const schema = zurg.lazy(zurg.string()); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("lazyObject() generates correct AST", () => { + const schema = zurg.lazyObject( + zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]) + ); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Schema Modifiers", () => { + it("optional() generates correct AST", () => { + const schema = zurg.string().optional(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("nullable() generates correct AST", () => { + const schema = zurg.string().nullable(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + + it("optionalNullable() generates correct AST", () => { + const schema = zurg.string().optionalNullable(); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Schema Operations", () => { + it("parse() generates correct AST", () => { + const schema = zurg.string(); + const rawExpr = ts.factory.createIdentifier("rawValue"); + const parseExpr = schema.parse(rawExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + const ast = printNode(parseExpr); + expect(ast).toMatchSnapshot(); + }); + + it("json() generates correct AST", () => { + const schema = zurg.string(); + const parsedExpr = ts.factory.createIdentifier("parsedValue"); + const jsonExpr = schema.json(parsedExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + const ast = printNode(jsonExpr); + expect(ast).toMatchSnapshot(); + }); + + it("parseOrThrow() generates correct AST", () => { + const schema = zurg.string(); + const rawExpr = ts.factory.createIdentifier("rawValue"); + const parseExpr = schema.parseOrThrow(rawExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + const ast = printNode(parseExpr); + expect(ast).toMatchSnapshot(); + }); + + it("jsonOrThrow() generates correct AST", () => { + const schema = zurg.string(); + const parsedExpr = ts.factory.createIdentifier("parsedValue"); + const jsonExpr = schema.jsonOrThrow(parsedExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + const ast = printNode(jsonExpr); + expect(ast).toMatchSnapshot(); + }); + + it("parse() with skipValidation generates correct AST", () => { + const schema = zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() } + ]); + const rawExpr = ts.factory.createIdentifier("rawValue"); + const parseExpr = schema.parse(rawExpr, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + omitUndefined: true, + breadcrumbsPrefix: ["request"] + }); + const ast = printNode(parseExpr); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Type References", () => { + it("Schema._getReferenceToType generates correct AST", () => { + const rawShape = ts.factory.createTypeLiteralNode([ + ts.factory.createPropertySignature( + undefined, + "name", + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) + ) + ]); + const parsedShape = ts.factory.createTypeLiteralNode([ + ts.factory.createPropertySignature( + undefined, + "name", + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) + ) + ]); + const typeNode = zurg.Schema._getReferenceToType({ rawShape, parsedShape }); + const ast = printNode(typeNode); + expect(ast).toMatchSnapshot(); + }); + + it("ObjectSchema._getReferenceToType generates correct AST", () => { + const rawShape = ts.factory.createTypeLiteralNode([]); + const parsedShape = ts.factory.createTypeLiteralNode([]); + const typeNode = zurg.ObjectSchema._getReferenceToType({ rawShape, parsedShape }); + const ast = printNode(typeNode); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("MaybeValid Visitor", () => { + it("_visitMaybeValid generates correct AST", () => { + const maybeValidRef = ts.factory.createIdentifier("result"); + const statements = zurg.Schema._visitMaybeValid(maybeValidRef, { + valid: (valueRef) => [ + ts.factory.createExpressionStatement( + ts.factory.createCallExpression( + ts.factory.createIdentifier("console.log"), + undefined, + [valueRef] + ) + ) + ], + invalid: (errorsRef) => [ + ts.factory.createThrowStatement( + ts.factory.createNewExpression( + ts.factory.createIdentifier("Error"), + undefined, + [errorsRef] + ) + ) + ] + }); + const block = ts.factory.createBlock(statements, true); + const ast = printNode(block); + expect(ast).toMatchSnapshot(); + }); + }); + + describe("Complex Nested Schemas", () => { + it("deeply nested object generates correct AST", () => { + const schema = zurg.object([ + { + key: { parsed: "user", raw: "user" }, + value: zurg.object([ + { key: { parsed: "profile", raw: "profile" }, value: zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number().optional() } + ])} + ]) + }, + { + key: { parsed: "tags", raw: "tags" }, + value: zurg.list(zurg.string()) + }, + { + key: { parsed: "metadata", raw: "metadata" }, + value: zurg.record({ keySchema: zurg.string(), valueSchema: zurg.any() }) + } + ]); + const ast = printNode(schema.toExpression()); + expect(ast).toMatchSnapshot(); + }); + }); +}); + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts new file mode 100644 index 000000000000..f7fb739a5690 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts @@ -0,0 +1,515 @@ +import { describe, expect, it } from "vitest"; +import { ts } from "ts-morph"; + +import { Reference } from "../../referencing"; +import { ZurgImpl } from "../../core-utilities/Zurg"; +import { ZurgFormat } from "../formats/ZurgFormat"; + +/** + * Helper to print TypeScript AST to string for comparison + */ +function printNode(node: ts.Node): string { + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const sourceFile = ts.createSourceFile("test.ts", "", ts.ScriptTarget.Latest, false, ts.ScriptKind.TS); + return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile); +} + +/** + * Create a mock reference that simulates what the real system does. + */ +function createMockReference(exportedName: string): Reference { + return { + getExpression: () => { + return ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + }, + getTypeNode: () => { + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ), + undefined + ); + }, + getEntityName: () => { + return ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + } + }; +} + +/** + * Create instances for testing + */ +function createZurgImpl(): ZurgImpl { + return new ZurgImpl({ + getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), + generateEndpointMetadata: false + }); +} + +function createZurgFormat(): ZurgFormat { + return new ZurgFormat({ + getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), + generateEndpointMetadata: false + }); +} + +describe("ZurgFormat produces identical output to ZurgImpl", () => { + const zurgImpl = createZurgImpl(); + const zurgFormat = createZurgFormat(); + + describe("Primitive Schemas", () => { + it("string() matches", () => { + const implAst = printNode(zurgImpl.string().toExpression()); + const formatAst = printNode(zurgFormat.string().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("number() matches", () => { + const implAst = printNode(zurgImpl.number().toExpression()); + const formatAst = printNode(zurgFormat.number().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("boolean() matches", () => { + const implAst = printNode(zurgImpl.boolean().toExpression()); + const formatAst = printNode(zurgFormat.boolean().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("bigint() matches", () => { + const implAst = printNode(zurgImpl.bigint().toExpression()); + const formatAst = printNode(zurgFormat.bigint().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("date() matches", () => { + const implAst = printNode(zurgImpl.date().toExpression()); + const formatAst = printNode(zurgFormat.date().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("any() matches", () => { + const implAst = printNode(zurgImpl.any().toExpression()); + const formatAst = printNode(zurgFormat.any().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("unknown() matches", () => { + const implAst = printNode(zurgImpl.unknown().toExpression()); + const formatAst = printNode(zurgFormat.unknown().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("never() matches", () => { + const implAst = printNode(zurgImpl.never().toExpression()); + const formatAst = printNode(zurgFormat.never().toExpression()); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Literal Schemas", () => { + it("stringLiteral() matches", () => { + const implAst = printNode(zurgImpl.stringLiteral("hello").toExpression()); + const formatAst = printNode(zurgFormat.stringLiteral("hello").toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("booleanLiteral(true) matches", () => { + const implAst = printNode(zurgImpl.booleanLiteral(true).toExpression()); + const formatAst = printNode(zurgFormat.booleanLiteral(true).toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("booleanLiteral(false) matches", () => { + const implAst = printNode(zurgImpl.booleanLiteral(false).toExpression()); + const formatAst = printNode(zurgFormat.booleanLiteral(false).toExpression()); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Object Schemas", () => { + it("empty object matches", () => { + const implAst = printNode(zurgImpl.object([]).toExpression()); + const formatAst = printNode(zurgFormat.object([]).toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("object with same raw/parsed keys matches", () => { + const implAst = printNode( + zurgImpl + .object([ + { key: { parsed: "name", raw: "name" }, value: zurgImpl.string() }, + { key: { parsed: "age", raw: "age" }, value: zurgImpl.number() } + ]) + .toExpression() + ); + const formatAst = printNode( + zurgFormat + .object([ + { key: { parsed: "name", raw: "name" }, value: zurgFormat.string() }, + { key: { parsed: "age", raw: "age" }, value: zurgFormat.number() } + ]) + .toExpression() + ); + expect(formatAst).toBe(implAst); + }); + + it("object with different raw/parsed keys matches", () => { + const implAst = printNode( + zurgImpl + .object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zurgImpl.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurgImpl.string() } + ]) + .toExpression() + ); + const formatAst = printNode( + zurgFormat + .object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zurgFormat.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurgFormat.string() } + ]) + .toExpression() + ); + expect(formatAst).toBe(implAst); + }); + + it("objectWithoutOptionalProperties matches", () => { + const implAst = printNode( + zurgImpl + .objectWithoutOptionalProperties([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }]) + .toExpression() + ); + const formatAst = printNode( + zurgFormat + .objectWithoutOptionalProperties([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }]) + .toExpression() + ); + expect(formatAst).toBe(implAst); + }); + + it("object.extend() matches", () => { + const implBase = zurgImpl.object([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }]); + const implExtended = implBase.extend( + zurgImpl.object([{ key: { parsed: "name", raw: "name" }, value: zurgImpl.string() }]) + ); + const implAst = printNode(implExtended.toExpression()); + + const formatBase = zurgFormat.object([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }]); + const formatExtended = formatBase.extend( + zurgFormat.object([{ key: { parsed: "name", raw: "name" }, value: zurgFormat.string() }]) + ); + const formatAst = printNode(formatExtended.toExpression()); + + expect(formatAst).toBe(implAst); + }); + + it("object.passthrough() matches", () => { + const implAst = printNode( + zurgImpl + .object([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }]) + .passthrough() + .toExpression() + ); + const formatAst = printNode( + zurgFormat + .object([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }]) + .passthrough() + .toExpression() + ); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Enum Schemas", () => { + it("enum with values matches", () => { + const implAst = printNode(zurgImpl.enum(["ACTIVE", "INACTIVE", "PENDING"]).toExpression()); + const formatAst = printNode(zurgFormat.enum(["ACTIVE", "INACTIVE", "PENDING"]).toExpression()); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Collection Schemas", () => { + it("list() matches", () => { + const implAst = printNode(zurgImpl.list(zurgImpl.string()).toExpression()); + const formatAst = printNode(zurgFormat.list(zurgFormat.string()).toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("set() matches", () => { + const implAst = printNode(zurgImpl.set(zurgImpl.number()).toExpression()); + const formatAst = printNode(zurgFormat.set(zurgFormat.number()).toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("record() matches", () => { + const implAst = printNode( + zurgImpl.record({ keySchema: zurgImpl.string(), valueSchema: zurgImpl.number() }).toExpression() + ); + const formatAst = printNode( + zurgFormat.record({ keySchema: zurgFormat.string(), valueSchema: zurgFormat.number() }).toExpression() + ); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Union Schemas", () => { + it("discriminated union matches", () => { + const implAst = printNode( + zurgImpl + .union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurgImpl.object([ + { key: { parsed: "breed", raw: "breed" }, value: zurgImpl.string() } + ]) + } + ] + }) + .toExpression() + ); + const formatAst = printNode( + zurgFormat + .union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurgFormat.object([ + { key: { parsed: "breed", raw: "breed" }, value: zurgFormat.string() } + ]) + } + ] + }) + .toExpression() + ); + expect(formatAst).toBe(implAst); + }); + + it("union with different discriminant names matches", () => { + const implAst = printNode( + zurgImpl + .union({ + parsedDiscriminant: "animalType", + rawDiscriminant: "animal_type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurgImpl.object([]) + } + ] + }) + .toExpression() + ); + const formatAst = printNode( + zurgFormat + .union({ + parsedDiscriminant: "animalType", + rawDiscriminant: "animal_type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurgFormat.object([]) + } + ] + }) + .toExpression() + ); + expect(formatAst).toBe(implAst); + }); + + it("undiscriminatedUnion matches", () => { + const implAst = printNode( + zurgImpl.undiscriminatedUnion([zurgImpl.string(), zurgImpl.number()]).toExpression() + ); + const formatAst = printNode( + zurgFormat.undiscriminatedUnion([zurgFormat.string(), zurgFormat.number()]).toExpression() + ); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Lazy Schemas", () => { + it("lazy() matches", () => { + const implAst = printNode(zurgImpl.lazy(zurgImpl.string()).toExpression()); + const formatAst = printNode(zurgFormat.lazy(zurgFormat.string()).toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("lazyObject() matches", () => { + const implAst = printNode( + zurgImpl + .lazyObject(zurgImpl.object([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }])) + .toExpression() + ); + const formatAst = printNode( + zurgFormat + .lazyObject(zurgFormat.object([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }])) + .toExpression() + ); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Schema Modifiers", () => { + it("optional() matches", () => { + const implAst = printNode(zurgImpl.string().optional().toExpression()); + const formatAst = printNode(zurgFormat.string().optional().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("nullable() matches", () => { + const implAst = printNode(zurgImpl.string().nullable().toExpression()); + const formatAst = printNode(zurgFormat.string().nullable().toExpression()); + expect(formatAst).toBe(implAst); + }); + + it("optionalNullable() matches", () => { + const implAst = printNode(zurgImpl.string().optionalNullable().toExpression()); + const formatAst = printNode(zurgFormat.string().optionalNullable().toExpression()); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Schema Operations", () => { + const schemaOpts = { + unrecognizedObjectKeys: "fail" as const, + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] as string[] + }; + + it("parse() matches", () => { + const rawExpr = ts.factory.createIdentifier("raw"); + const implAst = printNode(zurgImpl.string().parse(rawExpr, schemaOpts)); + const formatAst = printNode(zurgFormat.string().parse(rawExpr, schemaOpts)); + expect(formatAst).toBe(implAst); + }); + + it("json() matches", () => { + const parsedExpr = ts.factory.createIdentifier("parsed"); + const implAst = printNode(zurgImpl.string().json(parsedExpr, schemaOpts)); + const formatAst = printNode(zurgFormat.string().json(parsedExpr, schemaOpts)); + expect(formatAst).toBe(implAst); + }); + + it("parseOrThrow() matches", () => { + const rawExpr = ts.factory.createIdentifier("raw"); + const implAst = printNode(zurgImpl.string().parseOrThrow(rawExpr, schemaOpts)); + const formatAst = printNode(zurgFormat.string().parseOrThrow(rawExpr, schemaOpts)); + expect(formatAst).toBe(implAst); + }); + + it("jsonOrThrow() matches", () => { + const parsedExpr = ts.factory.createIdentifier("parsed"); + const implAst = printNode(zurgImpl.string().jsonOrThrow(parsedExpr, schemaOpts)); + const formatAst = printNode(zurgFormat.string().jsonOrThrow(parsedExpr, schemaOpts)); + expect(formatAst).toBe(implAst); + }); + + it("parse() with options matches", () => { + const rawExpr = ts.factory.createIdentifier("raw"); + const opts = { + unrecognizedObjectKeys: "passthrough" as const, + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + omitUndefined: true, + breadcrumbsPrefix: ["request"] + }; + const implAst = printNode(zurgImpl.string().parse(rawExpr, opts)); + const formatAst = printNode(zurgFormat.string().parse(rawExpr, opts)); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Type References", () => { + it("Schema._getReferenceToType matches", () => { + const rawShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + const parsedShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + + const implAst = printNode(zurgImpl.Schema._getReferenceToType({ rawShape, parsedShape })); + const formatAst = printNode(zurgFormat.Schema._getReferenceToType({ rawShape, parsedShape })); + expect(formatAst).toBe(implAst); + }); + + it("ObjectSchema._getReferenceToType matches", () => { + const rawShape = ts.factory.createTypeLiteralNode([]); + const parsedShape = ts.factory.createTypeLiteralNode([]); + + const implAst = printNode(zurgImpl.ObjectSchema._getReferenceToType({ rawShape, parsedShape })); + const formatAst = printNode(zurgFormat.ObjectSchema._getReferenceToType({ rawShape, parsedShape })); + expect(formatAst).toBe(implAst); + }); + }); + + describe("MaybeValid Visitor", () => { + it("_visitMaybeValid matches", () => { + const maybeValidRef = ts.factory.createIdentifier("result"); + const visitor = { + valid: (valueRef: ts.Expression) => [ + ts.factory.createExpressionStatement( + ts.factory.createCallExpression(ts.factory.createIdentifier("onValid"), undefined, [valueRef]) + ) + ], + invalid: (errorsRef: ts.Expression) => [ + ts.factory.createThrowStatement( + ts.factory.createNewExpression(ts.factory.createIdentifier("Error"), undefined, [errorsRef]) + ) + ] + }; + + const implStatements = zurgImpl.Schema._visitMaybeValid(maybeValidRef, visitor); + const formatStatements = zurgFormat.Schema._visitMaybeValid(maybeValidRef, visitor); + + const implAst = printNode(ts.factory.createBlock(implStatements, true)); + const formatAst = printNode(ts.factory.createBlock(formatStatements, true)); + expect(formatAst).toBe(implAst); + }); + }); + + describe("Field names", () => { + it("MaybeValid field names match", () => { + expect(zurgFormat.MaybeValid.ok).toBe(zurgImpl.MaybeValid.ok); + expect(zurgFormat.MaybeValid.Valid.value).toBe(zurgImpl.MaybeValid.Valid.value); + expect(zurgFormat.MaybeValid.Invalid.errors).toBe(zurgImpl.MaybeValid.Invalid.errors); + }); + + it("ValidationError field names match", () => { + expect(zurgFormat.ValidationError.path).toBe(zurgImpl.ValidationError.path); + expect(zurgFormat.ValidationError.message).toBe(zurgImpl.ValidationError.message); + }); + }); + + describe("Schema._fromExpression", () => { + it("basic usage matches", () => { + const expr = ts.factory.createIdentifier("someSchema"); + const implSchema = zurgImpl.Schema._fromExpression(expr); + const formatSchema = zurgFormat.Schema._fromExpression(expr); + + expect(printNode(formatSchema.toExpression())).toBe(printNode(implSchema.toExpression())); + }); + + it("with isObject option matches", () => { + const expr = ts.factory.createIdentifier("someObjectSchema"); + const implSchema = zurgImpl.Schema._fromExpression(expr, { isObject: true }); + const formatSchema = zurgFormat.Schema._fromExpression(expr, { isObject: true }); + + expect(printNode(formatSchema.toExpression())).toBe(printNode(implSchema.toExpression())); + }); + }); +}); + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap new file mode 100644 index 000000000000..999144b14eac --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -0,0 +1,113 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ZodFormat AST Generation > Collection Schemas > list() generates z.array() 1`] = `"z.array(z.string())"`; + +exports[`ZodFormat AST Generation > Collection Schemas > nested list generates z.array(z.array()) 1`] = `"z.array(z.array(z.string()))"`; + +exports[`ZodFormat AST Generation > Collection Schemas > record() generates z.record() 1`] = `"z.record(z.string(), z.number())"`; + +exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.set() 1`] = `"z.set(z.number())"`; + +exports[`ZodFormat AST Generation > Enum Schemas > enum generates z.enum() 1`] = `"z.enum(["ACTIVE", "INACTIVE", "PENDING"])"`; + +exports[`ZodFormat AST Generation > Lazy Schemas > lazy() generates z.lazy() 1`] = `"z.lazy(() => z.string())"`; + +exports[`ZodFormat AST Generation > Lazy Schemas > lazyObject() generates z.lazy() 1`] = ` +"z.lazy(() => z.object({ + "id": z.string() +}))" +`; + +exports[`ZodFormat AST Generation > Literal Schemas > booleanLiteral(false) generates z.literal(false) 1`] = `"z.literal(false)"`; + +exports[`ZodFormat AST Generation > Literal Schemas > booleanLiteral(true) generates z.literal(true) 1`] = `"z.literal(true)"`; + +exports[`ZodFormat AST Generation > Literal Schemas > stringLiteral() generates z.literal() 1`] = `"z.literal("hello")"`; + +exports[`ZodFormat AST Generation > MaybeValid Visitor > _visitMaybeValid generates if/else with success/data/error 1`] = ` +"{ + if (result.success) { + console.log(result.data); + } + else { + throw new Error(result.error); + } +}" +`; + +exports[`ZodFormat AST Generation > Object Schemas > empty object generates z.object({}) 1`] = `"z.object({})"`; + +exports[`ZodFormat AST Generation > Object Schemas > object with different raw/parsed keys generates transform 1`] = ` +"z.object({ + "first_name": z.string(), + "last_name": z.string() +}).transform(data => ({ + firstName: data.first_name, + lastName: data.last_name +}))" +`; + +exports[`ZodFormat AST Generation > Object Schemas > object with nullable property 1`] = ` +"z.object({ + "name": z.string().nullable() +})" +`; + +exports[`ZodFormat AST Generation > Object Schemas > object with optional property 1`] = ` +"z.object({ + "name": z.string(), + "nickname": z.string().optional() +})" +`; + +exports[`ZodFormat AST Generation > Object Schemas > object with same raw/parsed keys generates z.object() 1`] = ` +"z.object({ + "name": z.string(), + "age": z.number() +})" +`; + +exports[`ZodFormat AST Generation > Object Schemas > object.passthrough() 1`] = ` +"z.object({ + "id": z.string() +}).passthrough()" +`; + +exports[`ZodFormat AST Generation > Primitive Schemas > any() generates z.any() 1`] = `"z.any()"`; + +exports[`ZodFormat AST Generation > Primitive Schemas > bigint() generates z.bigint() 1`] = `"z.bigint()"`; + +exports[`ZodFormat AST Generation > Primitive Schemas > boolean() generates z.boolean() 1`] = `"z.boolean()"`; + +exports[`ZodFormat AST Generation > Primitive Schemas > date() generates z.string().transform() 1`] = `"z.string().transform(s => new Date(s))"`; + +exports[`ZodFormat AST Generation > Primitive Schemas > never() generates z.never() 1`] = `"z.never()"`; + +exports[`ZodFormat AST Generation > Primitive Schemas > number() generates z.number() 1`] = `"z.number()"`; + +exports[`ZodFormat AST Generation > Primitive Schemas > string() generates z.string() 1`] = `"z.string()"`; + +exports[`ZodFormat AST Generation > Primitive Schemas > unknown() generates z.unknown() 1`] = `"z.unknown()"`; + +exports[`ZodFormat AST Generation > Schema Modifiers > nullable() generates .nullable() 1`] = `"z.string().nullable()"`; + +exports[`ZodFormat AST Generation > Schema Modifiers > optional() generates .optional() 1`] = `"z.string().optional()"`; + +exports[`ZodFormat AST Generation > Schema Modifiers > optionalNullable() generates .optional().nullable() 1`] = `"z.string().optional().nullable()"`; + +exports[`ZodFormat AST Generation > Schema Operations > parse() generates .parse() 1`] = `"z.string().parse(rawValue)"`; + +exports[`ZodFormat AST Generation > Type References > Schema._getReferenceToType generates z.ZodType 1`] = `"z.ZodType"`; + +exports[`ZodFormat AST Generation > Union Schemas > discriminated union generates z.discriminatedUnion() 1`] = ` +"z.discriminatedUnion("type", [ + z.object({ "type": z.literal("dog") }).merge(z.object({ + "breed": z.string() + })), + z.object({ "type": z.literal("cat") }).merge(z.object({ + "indoor": z.boolean() + })) +])" +`; + +exports[`ZodFormat AST Generation > Union Schemas > undiscriminatedUnion generates z.union() 1`] = `"z.union([z.string(), z.number(), z.boolean()])"`; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap new file mode 100644 index 000000000000..937baaba1582 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap @@ -0,0 +1,165 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ZurgImpl AST Generation Baseline > Collection Schemas > list() generates correct AST 1`] = `"serialization.list(serialization.string())"`; + +exports[`ZurgImpl AST Generation Baseline > Collection Schemas > nested list generates correct AST 1`] = `"serialization.list(serialization.list(serialization.string()))"`; + +exports[`ZurgImpl AST Generation Baseline > Collection Schemas > record() generates correct AST 1`] = `"serialization.record(serialization.string(), serialization.number())"`; + +exports[`ZurgImpl AST Generation Baseline > Collection Schemas > set() generates correct AST 1`] = `"serialization.set(serialization.number())"`; + +exports[`ZurgImpl AST Generation Baseline > Complex Nested Schemas > deeply nested object generates correct AST 1`] = ` +"serialization.object({ + "user": serialization.object({ + "profile": serialization.object({ + "name": serialization.string(), + "age": serialization.number().optional() + }) + }), + "tags": serialization.list(serialization.string()), + "metadata": serialization.record(serialization.string(), serialization.any()) +})" +`; + +exports[`ZurgImpl AST Generation Baseline > Enum Schemas > enum with multiple values generates correct AST 1`] = `"serialization.enum_(["ACTIVE", "INACTIVE", "PENDING"])"`; + +exports[`ZurgImpl AST Generation Baseline > Enum Schemas > enum with single value generates correct AST 1`] = `"serialization.enum_(["ACTIVE"])"`; + +exports[`ZurgImpl AST Generation Baseline > Lazy Schemas (for recursion) > lazy() generates correct AST 1`] = `"serialization.lazy(() => serialization.string())"`; + +exports[`ZurgImpl AST Generation Baseline > Lazy Schemas (for recursion) > lazyObject() generates correct AST 1`] = ` +"serialization.lazyObject(() => serialization.object({ + "id": serialization.string() +}))" +`; + +exports[`ZurgImpl AST Generation Baseline > Literal Schemas > booleanLiteral(false) generates correct AST 1`] = `"serialization.booleanLiteral(false)"`; + +exports[`ZurgImpl AST Generation Baseline > Literal Schemas > booleanLiteral(true) generates correct AST 1`] = `"serialization.booleanLiteral(true)"`; + +exports[`ZurgImpl AST Generation Baseline > Literal Schemas > stringLiteral() generates correct AST 1`] = `"serialization.stringLiteral("hello")"`; + +exports[`ZurgImpl AST Generation Baseline > MaybeValid Visitor > _visitMaybeValid generates correct AST 1`] = ` +"{ + if (result.ok) { + console.log(result.value); + } + else { + throw new Error(result.errors); + } +}" +`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > empty object generates correct AST 1`] = `"serialization.object({})"`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with different raw/parsed keys generates correct AST 1`] = ` +"serialization.object({ + "firstName": serialization.property("first_name", serialization.string()), + "lastName": serialization.property("last_name", serialization.string()) +})" +`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with nullable property generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string().nullable() +})" +`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with optional property generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string(), + "nickname": serialization.string().optional() +})" +`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with same raw/parsed keys generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string(), + "age": serialization.number() +})" +`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > object.extend() generates correct AST 1`] = ` +"serialization.object({ + "id": serialization.string() +}).extend(serialization.object({ + "name": serialization.string() +}))" +`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > object.passthrough() generates correct AST 1`] = ` +"serialization.object({ + "id": serialization.string() +}).passthrough()" +`; + +exports[`ZurgImpl AST Generation Baseline > Object Schemas > objectWithoutOptionalProperties generates correct AST 1`] = ` +"serialization.objectWithoutOptionalProperties({ + "id": serialization.string() +})" +`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > any() generates correct AST 1`] = `"serialization.any()"`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > bigint() generates correct AST 1`] = `"serialization.bigint()"`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > boolean() generates correct AST 1`] = `"serialization.boolean()"`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > date() generates correct AST 1`] = `"serialization.date()"`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > never() generates correct AST 1`] = `"serialization.never()"`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > number() generates correct AST 1`] = `"serialization.number()"`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > string() generates correct AST 1`] = `"serialization.string()"`; + +exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > unknown() generates correct AST 1`] = `"serialization.unknown()"`; + +exports[`ZurgImpl AST Generation Baseline > Schema Modifiers > nullable() generates correct AST 1`] = `"serialization.string().nullable()"`; + +exports[`ZurgImpl AST Generation Baseline > Schema Modifiers > optional() generates correct AST 1`] = `"serialization.string().optional()"`; + +exports[`ZurgImpl AST Generation Baseline > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"serialization.string().optionalNullable()"`; + +exports[`ZurgImpl AST Generation Baseline > Schema Operations > json() generates correct AST 1`] = `"serialization.string().json(parsedValue)"`; + +exports[`ZurgImpl AST Generation Baseline > Schema Operations > jsonOrThrow() generates correct AST 1`] = `"serialization.string().jsonOrThrow(parsedValue)"`; + +exports[`ZurgImpl AST Generation Baseline > Schema Operations > parse() generates correct AST 1`] = `"serialization.string().parse(rawValue)"`; + +exports[`ZurgImpl AST Generation Baseline > Schema Operations > parse() with skipValidation generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string() +}).parse(rawValue, { unrecognizedObjectKeys: "passthrough", allowUnrecognizedUnionMembers: true, allowUnrecognizedEnumValues: true, skipValidation: true, omitUndefined: true, breadcrumbsPrefix: ["request"] })" +`; + +exports[`ZurgImpl AST Generation Baseline > Schema Operations > parseOrThrow() generates correct AST 1`] = `"serialization.string().parseOrThrow(rawValue)"`; + +exports[`ZurgImpl AST Generation Baseline > Type References > ObjectSchema._getReferenceToType generates correct AST 1`] = `"serialization.ObjectSchema<{}, {}>"`; + +exports[`ZurgImpl AST Generation Baseline > Type References > Schema._getReferenceToType generates correct AST 1`] = ` +"serialization.Schema<{ + name: string; +}, { + name: string; +}>" +`; + +exports[`ZurgImpl AST Generation Baseline > Union Schemas > discriminated union generates correct AST 1`] = ` +"serialization.union("type", { + "dog": serialization.object({ + "breed": serialization.string() + }), + "cat": serialization.object({ + "indoor": serialization.boolean() + }) +})" +`; + +exports[`ZurgImpl AST Generation Baseline > Union Schemas > undiscriminatedUnion generates correct AST 1`] = `"serialization.undiscriminatedUnion([serialization.string(), serialization.number(), serialization.boolean()])"`; + +exports[`ZurgImpl AST Generation Baseline > Union Schemas > union with different raw/parsed discriminant generates correct AST 1`] = ` +"serialization.union(serialization.discriminant("animalType", "animal_type"), { + "dog": serialization.object({}) +})" +`; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts new file mode 100644 index 000000000000..fd6485b60487 --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts @@ -0,0 +1,484 @@ +import { describe, it, expect, beforeAll } from "vitest"; +import { ts } from "ts-morph"; +import { performance } from "perf_hooks"; + +import { Reference } from "../../referencing"; +import { ZurgImpl } from "../../core-utilities/Zurg"; + +/** + * Create a mock reference for testing + */ +function createMockReference(exportedName: string): Reference { + return { + getExpression: () => { + return ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + }, + getTypeNode: () => { + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ), + undefined + ); + }, + getEntityName: () => { + return ts.factory.createQualifiedName( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(exportedName) + ); + } + }; +} + +/** + * Create a ZurgImpl instance for testing + */ +function createZurg(): ZurgImpl { + return new ZurgImpl({ + getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), + generateEndpointMetadata: false + }); +} + +/** + * Benchmark result structure + */ +interface BenchmarkResult { + name: string; + iterations: number; + totalTimeMs: number; + avgTimeMs: number; + opsPerSecond: number; + memoryUsedMB: number; +} + +/** + * Run a benchmark for a given operation + */ +function benchmark(name: string, fn: () => void, iterations: number = 1000): BenchmarkResult { + // Force GC if available (run with --expose-gc flag) + if (global.gc) { + global.gc(); + } + + const memBefore = process.memoryUsage().heapUsed; + + const start = performance.now(); + for (let i = 0; i < iterations; i++) { + fn(); + } + const end = performance.now(); + + const memAfter = process.memoryUsage().heapUsed; + + const totalTimeMs = end - start; + const avgTimeMs = totalTimeMs / iterations; + const opsPerSecond = 1000 / avgTimeMs; + const memoryUsedMB = (memAfter - memBefore) / 1024 / 1024; + + return { + name, + iterations, + totalTimeMs, + avgTimeMs, + opsPerSecond, + memoryUsedMB + }; +} + +/** + * Format benchmark results for logging + */ +function formatResult(result: BenchmarkResult): string { + return `${result.name}: + - Iterations: ${result.iterations} + - Total time: ${result.totalTimeMs.toFixed(2)}ms + - Avg time: ${result.avgTimeMs.toFixed(4)}ms + - Ops/sec: ${result.opsPerSecond.toFixed(2)} + - Memory delta: ${result.memoryUsedMB.toFixed(2)}MB`; +} + +describe("Zurg Performance Benchmarks", () => { + let zurg: ZurgImpl; + + beforeAll(() => { + zurg = createZurg(); + }); + + describe("Primitive Schema Creation", () => { + it("string() creation performance", () => { + const result = benchmark("string()", () => { + zurg.string(); + }, 10000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(1); // Should be sub-millisecond + }); + + it("number() creation performance", () => { + const result = benchmark("number()", () => { + zurg.number(); + }, 10000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(1); + }); + + it("boolean() creation performance", () => { + const result = benchmark("boolean()", () => { + zurg.boolean(); + }, 10000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(1); + }); + }); + + describe("Object Schema Creation", () => { + it("simple object (3 properties) creation performance", () => { + const result = benchmark("object (3 props)", () => { + zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number() } + ]); + }, 5000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(5); + }); + + it("medium object (10 properties) creation performance", () => { + const result = benchmark("object (10 props)", () => { + zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "email", raw: "email" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number() }, + { key: { parsed: "active", raw: "active" }, value: zurg.boolean() }, + { key: { parsed: "createdAt", raw: "created_at" }, value: zurg.date() }, + { key: { parsed: "updatedAt", raw: "updated_at" }, value: zurg.date() }, + { key: { parsed: "role", raw: "role" }, value: zurg.enum(["admin", "user", "guest"]) }, + { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) }, + { key: { parsed: "metadata", raw: "metadata" }, value: zurg.record({ keySchema: zurg.string(), valueSchema: zurg.any() }) } + ]); + }, 2000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(10); + }); + + it("object with property renaming performance", () => { + const result = benchmark("object (renamed props)", () => { + zurg.object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() }, + { key: { parsed: "emailAddress", raw: "email_address" }, value: zurg.string() }, + { key: { parsed: "phoneNumber", raw: "phone_number" }, value: zurg.string() }, + { key: { parsed: "dateOfBirth", raw: "date_of_birth" }, value: zurg.date() } + ]); + }, 3000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(5); + }); + }); + + describe("Union Schema Creation", () => { + it("discriminated union (3 variants) creation performance", () => { + const result = benchmark("union (3 variants)", () => { + zurg.union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "breed", raw: "breed" }, value: zurg.string() } + ]) + }, + { + discriminantValue: "cat", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "indoor", raw: "indoor" }, value: zurg.boolean() } + ]) + }, + { + discriminantValue: "bird", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "canFly", raw: "can_fly" }, value: zurg.boolean() } + ]) + } + ] + }); + }, 2000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(10); + }); + + it("undiscriminated union (5 types) creation performance", () => { + const result = benchmark("undiscriminatedUnion (5 types)", () => { + zurg.undiscriminatedUnion([ + zurg.string(), + zurg.number(), + zurg.boolean(), + zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]), + zurg.list(zurg.string()) + ]); + }, 3000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(5); + }); + }); + + describe("Collection Schema Creation", () => { + it("list schema creation performance", () => { + const result = benchmark("list(string())", () => { + zurg.list(zurg.string()); + }, 5000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + + it("nested list schema creation performance", () => { + const result = benchmark("list(list(string()))", () => { + zurg.list(zurg.list(zurg.string())); + }, 3000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(3); + }); + + it("record schema creation performance", () => { + const result = benchmark("record(string, object)", () => { + zurg.record({ + keySchema: zurg.string(), + valueSchema: zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() } + ]) + }); + }, 3000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(5); + }); + }); + + describe("AST Generation (toExpression)", () => { + it("simple object toExpression() performance", () => { + const schema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "name", raw: "name" }, value: zurg.string() } + ]); + + const result = benchmark("object.toExpression()", () => { + schema.toExpression(); + }, 5000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(1); + }); + + it("complex nested schema toExpression() performance", () => { + const schema = zurg.object([ + { + key: { parsed: "user", raw: "user" }, + value: zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "profile", raw: "profile" }, value: zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number().optional() }, + { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) } + ])} + ]) + }, + { + key: { parsed: "permissions", raw: "permissions" }, + value: zurg.list(zurg.enum(["read", "write", "admin"])) + } + ]); + + const result = benchmark("complex.toExpression()", () => { + schema.toExpression(); + }, 2000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + }); + + describe("Schema Operations", () => { + it("optional() chain performance", () => { + const result = benchmark("string().optional()", () => { + zurg.string().optional(); + }, 5000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + + it("nullable() chain performance", () => { + const result = benchmark("string().nullable()", () => { + zurg.string().nullable(); + }, 5000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + + it("object.extend() performance", () => { + const baseSchema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() } + ]); + + const result = benchmark("object.extend()", () => { + baseSchema.extend( + zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() } + ]) + ); + }, 3000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(5); + }); + + it("lazy() wrapper performance", () => { + const innerSchema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() } + ]); + + const result = benchmark("lazy()", () => { + zurg.lazy(innerSchema); + }, 5000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + + it("lazyObject() wrapper performance", () => { + const innerSchema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() } + ]); + + const result = benchmark("lazyObject()", () => { + zurg.lazyObject(innerSchema); + }, 5000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + }); + + describe("Parse/JSON Expression Generation", () => { + it("parse() expression generation performance", () => { + const schema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "name", raw: "name" }, value: zurg.string() } + ]); + const rawExpr = ts.factory.createIdentifier("raw"); + + const result = benchmark("schema.parse()", () => { + schema.parse(rawExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + }, 3000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + + it("json() expression generation performance", () => { + const schema = zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "name", raw: "name" }, value: zurg.string() } + ]); + const parsedExpr = ts.factory.createIdentifier("parsed"); + + const result = benchmark("schema.json()", () => { + schema.json(parsedExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + }, 3000); + + console.log(formatResult(result)); + expect(result.avgTimeMs).toBeLessThan(2); + }); + }); + + describe("Realistic Workload Simulation", () => { + it("simulate generating schemas for 100 types", () => { + const result = benchmark("100 type schemas", () => { + // Simulate a mix of types that might be in a real API + for (let i = 0; i < 100; i++) { + const typeIndex = i % 5; + switch (typeIndex) { + case 0: + // Simple object + zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "value", raw: "value" }, value: zurg.number() } + ]); + break; + case 1: + // Enum + zurg.enum(["A", "B", "C"]); + break; + case 2: + // List + zurg.list(zurg.string()); + break; + case 3: + // Union + zurg.union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "a", + nonDiscriminantProperties: zurg.object([]) + }, + { + discriminantValue: "b", + nonDiscriminantProperties: zurg.object([]) + } + ] + }); + break; + case 4: + // Complex object + zurg.object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() }, + { key: { parsed: "email", raw: "email" }, value: zurg.string().optional() }, + { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) } + ]); + break; + } + } + }, 100); + + console.log(formatResult(result)); + // 100 types should complete in reasonable time + expect(result.avgTimeMs).toBeLessThan(500); + }); + }); +}); + From 6eb3cbd336363e74d7bff2e10e648df9e1e98a94 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:39:28 -0500 Subject: [PATCH 10/71] added to cli class interfaces --- generators/typescript/express/cli/src/ExpressGeneratorCli.ts | 1 + generators/typescript/sdk/cli/src/SdkGeneratorCli.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/generators/typescript/express/cli/src/ExpressGeneratorCli.ts b/generators/typescript/express/cli/src/ExpressGeneratorCli.ts index 473460a0cd24..2d2a96d6a23b 100644 --- a/generators/typescript/express/cli/src/ExpressGeneratorCli.ts +++ b/generators/typescript/express/cli/src/ExpressGeneratorCli.ts @@ -84,6 +84,7 @@ export class ExpressGeneratorCli extends AbstractGeneratorCli { treatUnknownAsAny: customConfig.treatUnknownAsAny, includeContentHeadersOnFileDownloadResponse: customConfig.includeContentHeadersOnFileDownloadResponse, includeSerdeLayer: !customConfig.noSerdeLayer, + serializationFormat: customConfig.serializationFormat, retainOriginalCasing: customConfig.retainOriginalCasing ?? false, parameterNaming: customConfig.parameterNaming ?? "default", noOptionalProperties: customConfig.noOptionalProperties, From 8b5426ec1f0c4880ae443ae4df0db450a0430222 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:43:45 -0500 Subject: [PATCH 11/71] removed zurg option --- .../src/serialization-pipeline/SerializationFormat.ts | 2 +- .../src/serialization-pipeline/SerializationPipeline.ts | 7 +++---- .../src/serialization-pipeline/formats/ZurgFormat.ts | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts index 32e2a587e21d..e1bc60d0d828 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts @@ -168,7 +168,7 @@ export interface SerializationFormat { /** * Unique identifier for this format */ - readonly name: "zurg" | "zod" | "none"; + readonly name: "default" | "zod" | "none"; // ==================== Schema Builders ==================== diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index 9b3db5dda3f3..a239b7210863 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -6,7 +6,7 @@ import { NoneFormat } from "./formats/NoneFormat"; /** * Supported serialization format types */ -export type SerializationFormatType = "default" | "zurg" | "zod" | "none"; +export type SerializationFormatType = "default" | "zod" | "none"; /** * Configuration for creating a SerializationPipeline @@ -14,8 +14,8 @@ export type SerializationFormatType = "default" | "zurg" | "zod" | "none"; export interface SerializationPipelineConfig extends SerializationFormatConfig { /** * The serialization format to use. - * - "default" or "zurg": Use Zurg (bundled runtime) - * - "zod": Use Zod (npm dependency) - NOT YET IMPLEMENTED + * - "default": Use Zurg (bundled runtime) + * - "zod": Use Zod (npm dependency) * - "none": No serialization */ format: SerializationFormatType; @@ -41,7 +41,6 @@ export class SerializationPipeline { private createFormat(config: SerializationPipelineConfig): SerializationFormat { switch (config.format) { case "default": - case "zurg": return new ZurgFormat(config); case "zod": diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index 6b7e86b14f00..67a16ba5b50d 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -41,7 +41,7 @@ interface ZurgBaseSchema extends Schema { * This generates TypeScript AST that uses Zurg's runtime schema library. */ export class ZurgFormat implements SerializationFormat { - public readonly name = "zurg" as const; + public readonly name = "default" as const; private getReferenceToExport: (args: { manifest: CoreUtility.Manifest; exportedName: string }) => Reference; private generateEndpointMetadata: boolean; From 29c5b87b9df051319fe6ad96eec4f1eee1d1443b Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:44:45 -0500 Subject: [PATCH 12/71] integrated into core utilities manager --- .../core-utilities/CoreUtilitiesManager.ts | 59 ++++++++++++++++++- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts index 2803fb084280..5a319dc44857 100644 --- a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts +++ b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts @@ -8,6 +8,14 @@ import { DependencyManager } from "../dependency-manager/DependencyManager"; import { ExportsManager } from "../exports-manager"; import { ImportsManager } from "../imports-manager"; import { getReferenceToExportViaNamespaceImport } from "../referencing"; +import { + NoneFormat, + SerializationFormatType, + SerializationPipeline, + ZodFormat, + ZurgFormat, + ZURG_MANIFEST +} from "../serialization-pipeline"; import { AuthImpl } from "./Auth"; import { CallbackQueueImpl } from "./CallbackQueue"; import { CoreUtilities } from "./CoreUtilities"; @@ -22,7 +30,6 @@ import { StreamImpl } from "./Stream"; import { UrlUtilsImpl } from "./UrlUtils"; import { UtilsImpl } from "./Utils"; import { WebsocketImpl } from "./Websocket"; -import { ZurgImpl } from "./Zurg"; export declare namespace CoreUtilitiesManager { namespace getCoreUtilities { @@ -51,6 +58,7 @@ export class CoreUtilitiesManager { private readonly relativePackagePath: string; private readonly relativeTestPath: string; private readonly generateEndpointMetadata: boolean; + private readonly serializationFormat: SerializationFormatType; constructor({ streamType, @@ -58,7 +66,8 @@ export class CoreUtilitiesManager { fetchSupport, relativePackagePath = DEFAULT_PACKAGE_PATH, relativeTestPath = DEFAULT_TEST_PATH, - generateEndpointMetadata + generateEndpointMetadata, + serializationFormat = "default" }: { streamType: "wrapper" | "web"; formDataSupport: "Node16" | "Node18"; @@ -66,6 +75,7 @@ export class CoreUtilitiesManager { relativePackagePath?: string; relativeTestPath?: string; generateEndpointMetadata: boolean; + serializationFormat?: SerializationFormatType; }) { this.streamType = streamType; this.formDataSupport = formDataSupport; @@ -73,6 +83,7 @@ export class CoreUtilitiesManager { this.relativePackagePath = relativePackagePath; this.relativeTestPath = relativeTestPath; this.generateEndpointMetadata = generateEndpointMetadata; + this.serializationFormat = serializationFormat; } public getCoreUtilities({ @@ -90,8 +101,11 @@ export class CoreUtilitiesManager { relativeTestPath }); + // Create the serialization format based on configuration + const serializationFormat = this.createSerializationFormat(getReferenceToExport); + return { - zurg: new ZurgImpl({ getReferenceToExport, generateEndpointMetadata: this.generateEndpointMetadata }), + zurg: serializationFormat, fetcher: new FetcherImpl({ getReferenceToExport, generateEndpointMetadata: this.generateEndpointMetadata }), stream: new StreamImpl({ getReferenceToExport, generateEndpointMetadata: this.generateEndpointMetadata }), auth: new AuthImpl({ getReferenceToExport, generateEndpointMetadata: this.generateEndpointMetadata }), @@ -128,6 +142,31 @@ export class CoreUtilitiesManager { }; } + private createSerializationFormat( + getReferenceToExport: (args: { manifest: CoreUtility.Manifest; exportedName: string }) => ReturnType + ) { + const config = { + getReferenceToExport, + generateEndpointMetadata: this.generateEndpointMetadata + }; + + switch (this.serializationFormat) { + case "default": + // Add Zurg manifest to referenced utilities so it gets copied + this.addManifestAndDependencies(ZURG_MANIFEST); + return new ZurgFormat(config); + + case "zod": + return new ZodFormat(config); + + case "none": + return new NoneFormat(config); + + default: + throw new Error(`Unknown serialization format: ${this.serializationFormat}`); + } + } + public finalize(exportsManager: ExportsManager, dependencyManager: DependencyManager): void { for (const utility of Object.values(this.referencedCoreUtilities)) { exportsManager.addExportsForDirectories( @@ -145,6 +184,20 @@ export class CoreUtilitiesManager { fetchSupport: this.fetchSupport }); } + + // Add runtime dependencies for serialization format + this.addSerializationDependencies(dependencyManager); + } + + /** + * Add npm dependencies required by the active serialization format + */ + private addSerializationDependencies(dependencyManager: DependencyManager): void { + if (this.serializationFormat === "zod") { + // Zod uses an npm dependency instead of bundled runtime files + dependencyManager.addDependency("zod", "^3.23.0"); + } + // Zurg and None formats don't require external npm dependencies } public async copyCoreUtilities({ From 0c9651666816a08451a3c376b4b5b73f37f17b8b Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:45:07 -0500 Subject: [PATCH 13/71] added options to generators --- .../typescript/express/generator/src/ExpressGenerator.ts | 4 +++- generators/typescript/sdk/generator/src/SdkGenerator.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/generators/typescript/express/generator/src/ExpressGenerator.ts b/generators/typescript/express/generator/src/ExpressGenerator.ts index 5104904cfa49..f8574e8b04d7 100644 --- a/generators/typescript/express/generator/src/ExpressGenerator.ts +++ b/generators/typescript/express/generator/src/ExpressGenerator.ts @@ -59,6 +59,7 @@ export declare namespace ExpressGenerator { includeOtherInUnionTypes: boolean; treatUnknownAsAny: boolean; includeSerdeLayer: boolean; + serializationFormat: "default" | "zod" | "none"; outputEsm: boolean; retainOriginalCasing: boolean; allowExtraFields: boolean; @@ -134,7 +135,8 @@ export class ExpressGenerator { fetchSupport: "node-fetch", relativePackagePath: this.getRelativePackagePath(), relativeTestPath: this.getRelativeTestPath(), - generateEndpointMetadata: false + generateEndpointMetadata: false, + serializationFormat: config.serializationFormat }); this.asIsManager = new AsIsManager({ useBigInt: config.useBigInt, diff --git a/generators/typescript/sdk/generator/src/SdkGenerator.ts b/generators/typescript/sdk/generator/src/SdkGenerator.ts index bac7c240f804..729691c81727 100644 --- a/generators/typescript/sdk/generator/src/SdkGenerator.ts +++ b/generators/typescript/sdk/generator/src/SdkGenerator.ts @@ -124,6 +124,7 @@ export declare namespace SdkGenerator { treatUnknownAsAny: boolean; includeContentHeadersOnFileDownloadResponse: boolean; includeSerdeLayer: boolean; + serializationFormat: "default" | "zod" | "none"; noOptionalProperties: boolean; tolerateRepublish: boolean; retainOriginalCasing: boolean; @@ -289,7 +290,8 @@ export class SdkGenerator { fetchSupport: this.config.fetchSupport, relativePackagePath: this.relativePackagePath, relativeTestPath: this.relativeTestPath, - generateEndpointMetadata: this.config.generateEndpointMetadata + generateEndpointMetadata: this.config.generateEndpointMetadata, + serializationFormat: this.config.serializationFormat }); const apiDirectory: ExportedDirectory[] = [ From 0a0c4474cc650187690472ebdacf6d67e2ec4859 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:46:08 -0500 Subject: [PATCH 14/71] even more tests --- .../__tests__/SerializationPipeline.test.ts | 26 +- .../__tests__/ZurgBaseline.test.ts | 17 +- .../__tests__/ZurgFormat.test.ts | 474 ++++-------------- .../__snapshots__/ZurgBaseline.test.ts.snap | 164 ++++++ .../__snapshots__/ZurgFormat.test.ts.snap | 52 ++ .../__tests__/benchmark.test.ts | 13 +- 6 files changed, 347 insertions(+), 399 deletions(-) create mode 100644 generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts index ec2f5cf42bea..6b3925dd1aff 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts @@ -55,17 +55,6 @@ describe("SerializationPipeline", () => { expect(pipeline.isEnabled()).toBe(true); }); - it("creates ZurgFormat for 'zurg'", () => { - const pipeline = new SerializationPipeline({ - ...baseConfig, - format: "zurg" - }); - - expect(pipeline.getFormat()).toBeInstanceOf(ZurgFormat); - expect(pipeline.getFormatType()).toBe("zurg"); - expect(pipeline.isEnabled()).toBe(true); - }); - it("creates NoneFormat for 'none'", () => { const pipeline = new SerializationPipeline({ ...baseConfig, @@ -93,9 +82,9 @@ describe("SerializationPipeline", () => { it("returns explicit serializationFormat when provided", () => { expect( SerializationPipeline.resolveFormatType({ - serializationFormat: "zurg" + serializationFormat: "default" }) - ).toBe("zurg"); + ).toBe("default"); expect( SerializationPipeline.resolveFormatType({ @@ -134,10 +123,10 @@ describe("SerializationPipeline", () => { // Even with noSerdeLayer: true, explicit format wins expect( SerializationPipeline.resolveFormatType({ - serializationFormat: "zurg", + serializationFormat: "default", noSerdeLayer: true }) - ).toBe("zurg"); + ).toBe("default"); // And vice versa expect( @@ -153,7 +142,7 @@ describe("SerializationPipeline", () => { it("ZurgFormat returns no npm dependencies", () => { const pipeline = new SerializationPipeline({ ...baseConfig, - format: "zurg" + format: "default" }); expect(pipeline.getRuntimeDependencies()).toEqual({}); @@ -162,7 +151,7 @@ describe("SerializationPipeline", () => { it("ZurgFormat returns file patterns for bundled runtime", () => { const pipeline = new SerializationPipeline({ ...baseConfig, - format: "zurg" + format: "default" }); const patterns = pipeline.getRuntimeFilePatterns(); @@ -196,7 +185,7 @@ describe("SerializationPipeline", () => { it("ZurgFormat generates valid schema expressions", () => { const pipeline = new SerializationPipeline({ ...baseConfig, - format: "zurg" + format: "default" }); const format = pipeline.getFormat(); @@ -229,4 +218,3 @@ describe("SerializationPipeline", () => { }); }); }); - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts index 02e42f4a3127..941a1b95ee15 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts @@ -2,7 +2,8 @@ import { describe, expect, it } from "vitest"; import { ts } from "ts-morph"; import { Reference } from "../../referencing"; -import { ZurgImpl, MANIFEST as ZURG_MANIFEST } from "../../core-utilities/Zurg"; +import { ZurgFormat, ZURG_MANIFEST } from "../formats/ZurgFormat"; +import { CoreUtility } from "../../core-utilities/CoreUtility"; /** * Helper to print TypeScript AST to string for snapshot comparison @@ -44,16 +45,16 @@ function createMockReference(exportedName: string): Reference { } /** - * Create a ZurgImpl instance for testing + * Create a ZurgFormat instance for testing */ -function createZurg(): ZurgImpl { - return new ZurgImpl({ - getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), +function createZurg(): ZurgFormat { + return new ZurgFormat({ + getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => createMockReference(exportedName), generateEndpointMetadata: false }); } -describe("ZurgImpl AST Generation Baseline", () => { +describe("ZurgFormat AST Generation Baseline", () => { const zurg = createZurg(); describe("Primitive Schemas", () => { @@ -436,7 +437,7 @@ describe("ZurgImpl AST Generation Baseline", () => { it("_visitMaybeValid generates correct AST", () => { const maybeValidRef = ts.factory.createIdentifier("result"); const statements = zurg.Schema._visitMaybeValid(maybeValidRef, { - valid: (valueRef) => [ + valid: (valueRef: ts.Expression) => [ ts.factory.createExpressionStatement( ts.factory.createCallExpression( ts.factory.createIdentifier("console.log"), @@ -445,7 +446,7 @@ describe("ZurgImpl AST Generation Baseline", () => { ) ) ], - invalid: (errorsRef) => [ + invalid: (errorsRef: ts.Expression) => [ ts.factory.createThrowStatement( ts.factory.createNewExpression( ts.factory.createIdentifier("Error"), diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts index f7fb739a5690..dc4df2764ff5 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts @@ -2,8 +2,8 @@ import { describe, expect, it } from "vitest"; import { ts } from "ts-morph"; import { Reference } from "../../referencing"; -import { ZurgImpl } from "../../core-utilities/Zurg"; import { ZurgFormat } from "../formats/ZurgFormat"; +import { CoreUtility } from "../../core-utilities/CoreUtility"; /** * Helper to print TypeScript AST to string for comparison @@ -44,472 +44,214 @@ function createMockReference(exportedName: string): Reference { } /** - * Create instances for testing + * Create a ZurgFormat instance for testing */ -function createZurgImpl(): ZurgImpl { - return new ZurgImpl({ - getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), - generateEndpointMetadata: false - }); -} - function createZurgFormat(): ZurgFormat { return new ZurgFormat({ - getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), + getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => createMockReference(exportedName), generateEndpointMetadata: false }); } -describe("ZurgFormat produces identical output to ZurgImpl", () => { - const zurgImpl = createZurgImpl(); - const zurgFormat = createZurgFormat(); +describe("ZurgFormat AST Generation", () => { + const zurg = createZurgFormat(); describe("Primitive Schemas", () => { - it("string() matches", () => { - const implAst = printNode(zurgImpl.string().toExpression()); - const formatAst = printNode(zurgFormat.string().toExpression()); - expect(formatAst).toBe(implAst); + it("string() generates correct AST", () => { + const ast = printNode(zurg.string().toExpression()); + expect(ast).toBe("serialization.string()"); }); - it("number() matches", () => { - const implAst = printNode(zurgImpl.number().toExpression()); - const formatAst = printNode(zurgFormat.number().toExpression()); - expect(formatAst).toBe(implAst); + it("number() generates correct AST", () => { + const ast = printNode(zurg.number().toExpression()); + expect(ast).toBe("serialization.number()"); }); - it("boolean() matches", () => { - const implAst = printNode(zurgImpl.boolean().toExpression()); - const formatAst = printNode(zurgFormat.boolean().toExpression()); - expect(formatAst).toBe(implAst); + it("boolean() generates correct AST", () => { + const ast = printNode(zurg.boolean().toExpression()); + expect(ast).toBe("serialization.boolean()"); }); - it("bigint() matches", () => { - const implAst = printNode(zurgImpl.bigint().toExpression()); - const formatAst = printNode(zurgFormat.bigint().toExpression()); - expect(formatAst).toBe(implAst); + it("bigint() generates correct AST", () => { + const ast = printNode(zurg.bigint().toExpression()); + expect(ast).toBe("serialization.bigint()"); }); - it("date() matches", () => { - const implAst = printNode(zurgImpl.date().toExpression()); - const formatAst = printNode(zurgFormat.date().toExpression()); - expect(formatAst).toBe(implAst); + it("date() generates correct AST", () => { + const ast = printNode(zurg.date().toExpression()); + expect(ast).toBe("serialization.date()"); }); - it("any() matches", () => { - const implAst = printNode(zurgImpl.any().toExpression()); - const formatAst = printNode(zurgFormat.any().toExpression()); - expect(formatAst).toBe(implAst); + it("any() generates correct AST", () => { + const ast = printNode(zurg.any().toExpression()); + expect(ast).toBe("serialization.any()"); }); - it("unknown() matches", () => { - const implAst = printNode(zurgImpl.unknown().toExpression()); - const formatAst = printNode(zurgFormat.unknown().toExpression()); - expect(formatAst).toBe(implAst); + it("unknown() generates correct AST", () => { + const ast = printNode(zurg.unknown().toExpression()); + expect(ast).toBe("serialization.unknown()"); }); - it("never() matches", () => { - const implAst = printNode(zurgImpl.never().toExpression()); - const formatAst = printNode(zurgFormat.never().toExpression()); - expect(formatAst).toBe(implAst); + it("never() generates correct AST", () => { + const ast = printNode(zurg.never().toExpression()); + expect(ast).toBe("serialization.never()"); }); }); describe("Literal Schemas", () => { - it("stringLiteral() matches", () => { - const implAst = printNode(zurgImpl.stringLiteral("hello").toExpression()); - const formatAst = printNode(zurgFormat.stringLiteral("hello").toExpression()); - expect(formatAst).toBe(implAst); + it("stringLiteral() generates correct AST", () => { + const ast = printNode(zurg.stringLiteral("hello").toExpression()); + expect(ast).toBe('serialization.stringLiteral("hello")'); }); - it("booleanLiteral(true) matches", () => { - const implAst = printNode(zurgImpl.booleanLiteral(true).toExpression()); - const formatAst = printNode(zurgFormat.booleanLiteral(true).toExpression()); - expect(formatAst).toBe(implAst); + it("booleanLiteral(true) generates correct AST", () => { + const ast = printNode(zurg.booleanLiteral(true).toExpression()); + expect(ast).toBe("serialization.booleanLiteral(true)"); }); - it("booleanLiteral(false) matches", () => { - const implAst = printNode(zurgImpl.booleanLiteral(false).toExpression()); - const formatAst = printNode(zurgFormat.booleanLiteral(false).toExpression()); - expect(formatAst).toBe(implAst); + it("booleanLiteral(false) generates correct AST", () => { + const ast = printNode(zurg.booleanLiteral(false).toExpression()); + expect(ast).toBe("serialization.booleanLiteral(false)"); }); }); describe("Object Schemas", () => { - it("empty object matches", () => { - const implAst = printNode(zurgImpl.object([]).toExpression()); - const formatAst = printNode(zurgFormat.object([]).toExpression()); - expect(formatAst).toBe(implAst); + it("empty object generates correct AST", () => { + const ast = printNode(zurg.object([]).toExpression()); + expect(ast).toMatchSnapshot(); }); - it("object with same raw/parsed keys matches", () => { - const implAst = printNode( - zurgImpl - .object([ - { key: { parsed: "name", raw: "name" }, value: zurgImpl.string() }, - { key: { parsed: "age", raw: "age" }, value: zurgImpl.number() } - ]) - .toExpression() - ); - const formatAst = printNode( - zurgFormat + it("object with same raw/parsed keys generates correct AST", () => { + const ast = printNode( + zurg .object([ - { key: { parsed: "name", raw: "name" }, value: zurgFormat.string() }, - { key: { parsed: "age", raw: "age" }, value: zurgFormat.number() } + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number() } ]) .toExpression() ); - expect(formatAst).toBe(implAst); + expect(ast).toMatchSnapshot(); }); - it("object with different raw/parsed keys matches", () => { - const implAst = printNode( - zurgImpl - .object([ - { key: { parsed: "firstName", raw: "first_name" }, value: zurgImpl.string() }, - { key: { parsed: "lastName", raw: "last_name" }, value: zurgImpl.string() } - ]) - .toExpression() - ); - const formatAst = printNode( - zurgFormat + it("object with different raw/parsed keys generates correct AST", () => { + const ast = printNode( + zurg .object([ - { key: { parsed: "firstName", raw: "first_name" }, value: zurgFormat.string() }, - { key: { parsed: "lastName", raw: "last_name" }, value: zurgFormat.string() } + { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() } ]) .toExpression() ); - expect(formatAst).toBe(implAst); - }); - - it("objectWithoutOptionalProperties matches", () => { - const implAst = printNode( - zurgImpl - .objectWithoutOptionalProperties([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }]) - .toExpression() - ); - const formatAst = printNode( - zurgFormat - .objectWithoutOptionalProperties([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }]) - .toExpression() - ); - expect(formatAst).toBe(implAst); - }); - - it("object.extend() matches", () => { - const implBase = zurgImpl.object([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }]); - const implExtended = implBase.extend( - zurgImpl.object([{ key: { parsed: "name", raw: "name" }, value: zurgImpl.string() }]) - ); - const implAst = printNode(implExtended.toExpression()); - - const formatBase = zurgFormat.object([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }]); - const formatExtended = formatBase.extend( - zurgFormat.object([{ key: { parsed: "name", raw: "name" }, value: zurgFormat.string() }]) - ); - const formatAst = printNode(formatExtended.toExpression()); - - expect(formatAst).toBe(implAst); - }); - - it("object.passthrough() matches", () => { - const implAst = printNode( - zurgImpl - .object([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }]) - .passthrough() - .toExpression() - ); - const formatAst = printNode( - zurgFormat - .object([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }]) - .passthrough() - .toExpression() - ); - expect(formatAst).toBe(implAst); + expect(ast).toMatchSnapshot(); }); }); - describe("Enum Schemas", () => { - it("enum with values matches", () => { - const implAst = printNode(zurgImpl.enum(["ACTIVE", "INACTIVE", "PENDING"]).toExpression()); - const formatAst = printNode(zurgFormat.enum(["ACTIVE", "INACTIVE", "PENDING"]).toExpression()); - expect(formatAst).toBe(implAst); + describe("Enum Schema", () => { + it("enum with values generates correct AST", () => { + const ast = printNode(zurg.enum(["A", "B", "C"]).toExpression()); + expect(ast).toMatchSnapshot(); }); }); describe("Collection Schemas", () => { - it("list() matches", () => { - const implAst = printNode(zurgImpl.list(zurgImpl.string()).toExpression()); - const formatAst = printNode(zurgFormat.list(zurgFormat.string()).toExpression()); - expect(formatAst).toBe(implAst); + it("list(string()) generates correct AST", () => { + const ast = printNode(zurg.list(zurg.string()).toExpression()); + expect(ast).toMatchSnapshot(); }); - it("set() matches", () => { - const implAst = printNode(zurgImpl.set(zurgImpl.number()).toExpression()); - const formatAst = printNode(zurgFormat.set(zurgFormat.number()).toExpression()); - expect(formatAst).toBe(implAst); + it("set(number()) generates correct AST", () => { + const ast = printNode(zurg.set(zurg.number()).toExpression()); + expect(ast).toMatchSnapshot(); }); - it("record() matches", () => { - const implAst = printNode( - zurgImpl.record({ keySchema: zurgImpl.string(), valueSchema: zurgImpl.number() }).toExpression() + it("record(string, any) generates correct AST", () => { + const ast = printNode( + zurg.record({ keySchema: zurg.string(), valueSchema: zurg.any() }).toExpression() ); - const formatAst = printNode( - zurgFormat.record({ keySchema: zurgFormat.string(), valueSchema: zurgFormat.number() }).toExpression() - ); - expect(formatAst).toBe(implAst); + expect(ast).toMatchSnapshot(); }); }); describe("Union Schemas", () => { - it("discriminated union matches", () => { - const implAst = printNode( - zurgImpl + it("discriminated union generates correct AST", () => { + const ast = printNode( + zurg .union({ parsedDiscriminant: "type", rawDiscriminant: "type", singleUnionTypes: [ { discriminantValue: "dog", - nonDiscriminantProperties: zurgImpl.object([ - { key: { parsed: "breed", raw: "breed" }, value: zurgImpl.string() } + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "breed", raw: "breed" }, value: zurg.string() } ]) - } - ] - }) - .toExpression() - ); - const formatAst = printNode( - zurgFormat - .union({ - parsedDiscriminant: "type", - rawDiscriminant: "type", - singleUnionTypes: [ + }, { - discriminantValue: "dog", - nonDiscriminantProperties: zurgFormat.object([ - { key: { parsed: "breed", raw: "breed" }, value: zurgFormat.string() } + discriminantValue: "cat", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "indoor", raw: "indoor" }, value: zurg.boolean() } ]) } ] }) .toExpression() ); - expect(formatAst).toBe(implAst); - }); - - it("union with different discriminant names matches", () => { - const implAst = printNode( - zurgImpl - .union({ - parsedDiscriminant: "animalType", - rawDiscriminant: "animal_type", - singleUnionTypes: [ - { - discriminantValue: "dog", - nonDiscriminantProperties: zurgImpl.object([]) - } - ] - }) - .toExpression() - ); - const formatAst = printNode( - zurgFormat - .union({ - parsedDiscriminant: "animalType", - rawDiscriminant: "animal_type", - singleUnionTypes: [ - { - discriminantValue: "dog", - nonDiscriminantProperties: zurgFormat.object([]) - } - ] - }) - .toExpression() - ); - expect(formatAst).toBe(implAst); + expect(ast).toMatchSnapshot(); }); - it("undiscriminatedUnion matches", () => { - const implAst = printNode( - zurgImpl.undiscriminatedUnion([zurgImpl.string(), zurgImpl.number()]).toExpression() - ); - const formatAst = printNode( - zurgFormat.undiscriminatedUnion([zurgFormat.string(), zurgFormat.number()]).toExpression() + it("undiscriminated union generates correct AST", () => { + const ast = printNode( + zurg.undiscriminatedUnion([zurg.string(), zurg.number(), zurg.boolean()]).toExpression() ); - expect(formatAst).toBe(implAst); - }); - }); - - describe("Lazy Schemas", () => { - it("lazy() matches", () => { - const implAst = printNode(zurgImpl.lazy(zurgImpl.string()).toExpression()); - const formatAst = printNode(zurgFormat.lazy(zurgFormat.string()).toExpression()); - expect(formatAst).toBe(implAst); - }); - - it("lazyObject() matches", () => { - const implAst = printNode( - zurgImpl - .lazyObject(zurgImpl.object([{ key: { parsed: "id", raw: "id" }, value: zurgImpl.string() }])) - .toExpression() - ); - const formatAst = printNode( - zurgFormat - .lazyObject(zurgFormat.object([{ key: { parsed: "id", raw: "id" }, value: zurgFormat.string() }])) - .toExpression() - ); - expect(formatAst).toBe(implAst); + expect(ast).toMatchSnapshot(); }); }); describe("Schema Modifiers", () => { - it("optional() matches", () => { - const implAst = printNode(zurgImpl.string().optional().toExpression()); - const formatAst = printNode(zurgFormat.string().optional().toExpression()); - expect(formatAst).toBe(implAst); - }); - - it("nullable() matches", () => { - const implAst = printNode(zurgImpl.string().nullable().toExpression()); - const formatAst = printNode(zurgFormat.string().nullable().toExpression()); - expect(formatAst).toBe(implAst); - }); - - it("optionalNullable() matches", () => { - const implAst = printNode(zurgImpl.string().optionalNullable().toExpression()); - const formatAst = printNode(zurgFormat.string().optionalNullable().toExpression()); - expect(formatAst).toBe(implAst); - }); - }); - - describe("Schema Operations", () => { - const schemaOpts = { - unrecognizedObjectKeys: "fail" as const, - allowUnrecognizedUnionMembers: false, - allowUnrecognizedEnumValues: false, - skipValidation: false, - omitUndefined: false, - breadcrumbsPrefix: [] as string[] - }; - - it("parse() matches", () => { - const rawExpr = ts.factory.createIdentifier("raw"); - const implAst = printNode(zurgImpl.string().parse(rawExpr, schemaOpts)); - const formatAst = printNode(zurgFormat.string().parse(rawExpr, schemaOpts)); - expect(formatAst).toBe(implAst); - }); - - it("json() matches", () => { - const parsedExpr = ts.factory.createIdentifier("parsed"); - const implAst = printNode(zurgImpl.string().json(parsedExpr, schemaOpts)); - const formatAst = printNode(zurgFormat.string().json(parsedExpr, schemaOpts)); - expect(formatAst).toBe(implAst); - }); - - it("parseOrThrow() matches", () => { - const rawExpr = ts.factory.createIdentifier("raw"); - const implAst = printNode(zurgImpl.string().parseOrThrow(rawExpr, schemaOpts)); - const formatAst = printNode(zurgFormat.string().parseOrThrow(rawExpr, schemaOpts)); - expect(formatAst).toBe(implAst); + it("optional() generates correct AST", () => { + const ast = printNode(zurg.string().optional().toExpression()); + expect(ast).toMatchSnapshot(); }); - it("jsonOrThrow() matches", () => { - const parsedExpr = ts.factory.createIdentifier("parsed"); - const implAst = printNode(zurgImpl.string().jsonOrThrow(parsedExpr, schemaOpts)); - const formatAst = printNode(zurgFormat.string().jsonOrThrow(parsedExpr, schemaOpts)); - expect(formatAst).toBe(implAst); + it("nullable() generates correct AST", () => { + const ast = printNode(zurg.string().nullable().toExpression()); + expect(ast).toMatchSnapshot(); }); - it("parse() with options matches", () => { - const rawExpr = ts.factory.createIdentifier("raw"); - const opts = { - unrecognizedObjectKeys: "passthrough" as const, - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - omitUndefined: true, - breadcrumbsPrefix: ["request"] - }; - const implAst = printNode(zurgImpl.string().parse(rawExpr, opts)); - const formatAst = printNode(zurgFormat.string().parse(rawExpr, opts)); - expect(formatAst).toBe(implAst); + it("optionalNullable() generates correct AST", () => { + const ast = printNode(zurg.string().optionalNullable().toExpression()); + expect(ast).toMatchSnapshot(); }); }); - describe("Type References", () => { - it("Schema._getReferenceToType matches", () => { - const rawShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); - const parsedShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); - - const implAst = printNode(zurgImpl.Schema._getReferenceToType({ rawShape, parsedShape })); - const formatAst = printNode(zurgFormat.Schema._getReferenceToType({ rawShape, parsedShape })); - expect(formatAst).toBe(implAst); - }); - - it("ObjectSchema._getReferenceToType matches", () => { - const rawShape = ts.factory.createTypeLiteralNode([]); - const parsedShape = ts.factory.createTypeLiteralNode([]); - - const implAst = printNode(zurgImpl.ObjectSchema._getReferenceToType({ rawShape, parsedShape })); - const formatAst = printNode(zurgFormat.ObjectSchema._getReferenceToType({ rawShape, parsedShape })); - expect(formatAst).toBe(implAst); + describe("Lazy Schemas", () => { + it("lazy() generates correct AST", () => { + const ast = printNode(zurg.lazy(zurg.string()).toExpression()); + expect(ast).toMatchSnapshot(); }); - }); - describe("MaybeValid Visitor", () => { - it("_visitMaybeValid matches", () => { - const maybeValidRef = ts.factory.createIdentifier("result"); - const visitor = { - valid: (valueRef: ts.Expression) => [ - ts.factory.createExpressionStatement( - ts.factory.createCallExpression(ts.factory.createIdentifier("onValid"), undefined, [valueRef]) - ) - ], - invalid: (errorsRef: ts.Expression) => [ - ts.factory.createThrowStatement( - ts.factory.createNewExpression(ts.factory.createIdentifier("Error"), undefined, [errorsRef]) - ) - ] - }; - - const implStatements = zurgImpl.Schema._visitMaybeValid(maybeValidRef, visitor); - const formatStatements = zurgFormat.Schema._visitMaybeValid(maybeValidRef, visitor); - - const implAst = printNode(ts.factory.createBlock(implStatements, true)); - const formatAst = printNode(ts.factory.createBlock(formatStatements, true)); - expect(formatAst).toBe(implAst); + it("lazyObject() generates correct AST", () => { + const innerSchema = zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]); + const ast = printNode(zurg.lazyObject(innerSchema).toExpression()); + expect(ast).toMatchSnapshot(); }); }); - describe("Field names", () => { - it("MaybeValid field names match", () => { - expect(zurgFormat.MaybeValid.ok).toBe(zurgImpl.MaybeValid.ok); - expect(zurgFormat.MaybeValid.Valid.value).toBe(zurgImpl.MaybeValid.Valid.value); - expect(zurgFormat.MaybeValid.Invalid.errors).toBe(zurgImpl.MaybeValid.Invalid.errors); + describe("Runtime Configuration", () => { + it("returns empty dependencies for Zurg", () => { + expect(zurg.getRuntimeDependencies()).toEqual({}); }); - it("ValidationError field names match", () => { - expect(zurgFormat.ValidationError.path).toBe(zurgImpl.ValidationError.path); - expect(zurgFormat.ValidationError.message).toBe(zurgImpl.ValidationError.message); + it("returns runtime file patterns for Zurg", () => { + const patterns = zurg.getRuntimeFilePatterns(); + expect(patterns).not.toBeNull(); + expect(patterns?.patterns).toContain("src/core/schemas/**"); }); }); - describe("Schema._fromExpression", () => { - it("basic usage matches", () => { - const expr = ts.factory.createIdentifier("someSchema"); - const implSchema = zurgImpl.Schema._fromExpression(expr); - const formatSchema = zurgFormat.Schema._fromExpression(expr); - - expect(printNode(formatSchema.toExpression())).toBe(printNode(implSchema.toExpression())); - }); - - it("with isObject option matches", () => { - const expr = ts.factory.createIdentifier("someObjectSchema"); - const implSchema = zurgImpl.Schema._fromExpression(expr, { isObject: true }); - const formatSchema = zurgFormat.Schema._fromExpression(expr, { isObject: true }); - - expect(printNode(formatSchema.toExpression())).toBe(printNode(implSchema.toExpression())); + describe("Format Identity", () => { + it("has name 'default'", () => { + expect(zurg.name).toBe("default"); }); }); }); - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap index 937baaba1582..8b479218d6f9 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap @@ -1,5 +1,169 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > list() generates correct AST 1`] = `"serialization.list(serialization.string())"`; + +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > nested list generates correct AST 1`] = `"serialization.list(serialization.list(serialization.string()))"`; + +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > record() generates correct AST 1`] = `"serialization.record(serialization.string(), serialization.number())"`; + +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > set() generates correct AST 1`] = `"serialization.set(serialization.number())"`; + +exports[`ZurgFormat AST Generation Baseline > Complex Nested Schemas > deeply nested object generates correct AST 1`] = ` +"serialization.object({ + "user": serialization.object({ + "profile": serialization.object({ + "name": serialization.string(), + "age": serialization.number().optional() + }) + }), + "tags": serialization.list(serialization.string()), + "metadata": serialization.record(serialization.string(), serialization.any()) +})" +`; + +exports[`ZurgFormat AST Generation Baseline > Enum Schemas > enum with multiple values generates correct AST 1`] = `"serialization.enum_(["ACTIVE", "INACTIVE", "PENDING"])"`; + +exports[`ZurgFormat AST Generation Baseline > Enum Schemas > enum with single value generates correct AST 1`] = `"serialization.enum_(["ACTIVE"])"`; + +exports[`ZurgFormat AST Generation Baseline > Lazy Schemas (for recursion) > lazy() generates correct AST 1`] = `"serialization.lazy(() => serialization.string())"`; + +exports[`ZurgFormat AST Generation Baseline > Lazy Schemas (for recursion) > lazyObject() generates correct AST 1`] = ` +"serialization.lazyObject(() => serialization.object({ + "id": serialization.string() +}))" +`; + +exports[`ZurgFormat AST Generation Baseline > Literal Schemas > booleanLiteral(false) generates correct AST 1`] = `"serialization.booleanLiteral(false)"`; + +exports[`ZurgFormat AST Generation Baseline > Literal Schemas > booleanLiteral(true) generates correct AST 1`] = `"serialization.booleanLiteral(true)"`; + +exports[`ZurgFormat AST Generation Baseline > Literal Schemas > stringLiteral() generates correct AST 1`] = `"serialization.stringLiteral("hello")"`; + +exports[`ZurgFormat AST Generation Baseline > MaybeValid Visitor > _visitMaybeValid generates correct AST 1`] = ` +"{ + if (result.ok) { + console.log(result.value); + } + else { + throw new Error(result.errors); + } +}" +`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > empty object generates correct AST 1`] = `"serialization.object({})"`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with different raw/parsed keys generates correct AST 1`] = ` +"serialization.object({ + "firstName": serialization.property("first_name", serialization.string()), + "lastName": serialization.property("last_name", serialization.string()) +})" +`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with nullable property generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string().nullable() +})" +`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with optional property generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string(), + "nickname": serialization.string().optional() +})" +`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with same raw/parsed keys generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string(), + "age": serialization.number() +})" +`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > object.extend() generates correct AST 1`] = ` +"serialization.object({ + "id": serialization.string() +}).extend(serialization.object({ + "name": serialization.string() +}))" +`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > object.passthrough() generates correct AST 1`] = ` +"serialization.object({ + "id": serialization.string() +}).passthrough()" +`; + +exports[`ZurgFormat AST Generation Baseline > Object Schemas > objectWithoutOptionalProperties generates correct AST 1`] = ` +"serialization.objectWithoutOptionalProperties({ + "id": serialization.string() +})" +`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > any() generates correct AST 1`] = `"serialization.any()"`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > bigint() generates correct AST 1`] = `"serialization.bigint()"`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > boolean() generates correct AST 1`] = `"serialization.boolean()"`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > date() generates correct AST 1`] = `"serialization.date()"`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > never() generates correct AST 1`] = `"serialization.never()"`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > number() generates correct AST 1`] = `"serialization.number()"`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > string() generates correct AST 1`] = `"serialization.string()"`; + +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > unknown() generates correct AST 1`] = `"serialization.unknown()"`; + +exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > nullable() generates correct AST 1`] = `"serialization.string().nullable()"`; + +exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > optional() generates correct AST 1`] = `"serialization.string().optional()"`; + +exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"serialization.string().optionalNullable()"`; + +exports[`ZurgFormat AST Generation Baseline > Schema Operations > json() generates correct AST 1`] = `"serialization.string().json(parsedValue)"`; + +exports[`ZurgFormat AST Generation Baseline > Schema Operations > jsonOrThrow() generates correct AST 1`] = `"serialization.string().jsonOrThrow(parsedValue)"`; + +exports[`ZurgFormat AST Generation Baseline > Schema Operations > parse() generates correct AST 1`] = `"serialization.string().parse(rawValue)"`; + +exports[`ZurgFormat AST Generation Baseline > Schema Operations > parse() with skipValidation generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string() +}).parse(rawValue, { unrecognizedObjectKeys: "passthrough", allowUnrecognizedUnionMembers: true, allowUnrecognizedEnumValues: true, skipValidation: true, omitUndefined: true, breadcrumbsPrefix: ["request"] })" +`; + +exports[`ZurgFormat AST Generation Baseline > Schema Operations > parseOrThrow() generates correct AST 1`] = `"serialization.string().parseOrThrow(rawValue)"`; + +exports[`ZurgFormat AST Generation Baseline > Type References > ObjectSchema._getReferenceToType generates correct AST 1`] = `"serialization.ObjectSchema<{}, {}>"`; + +exports[`ZurgFormat AST Generation Baseline > Type References > Schema._getReferenceToType generates correct AST 1`] = ` +"serialization.Schema<{ + name: string; +}, { + name: string; +}>" +`; + +exports[`ZurgFormat AST Generation Baseline > Union Schemas > discriminated union generates correct AST 1`] = ` +"serialization.union("type", { + "dog": serialization.object({ + "breed": serialization.string() + }), + "cat": serialization.object({ + "indoor": serialization.boolean() + }) +})" +`; + +exports[`ZurgFormat AST Generation Baseline > Union Schemas > undiscriminatedUnion generates correct AST 1`] = `"serialization.undiscriminatedUnion([serialization.string(), serialization.number(), serialization.boolean()])"`; + +exports[`ZurgFormat AST Generation Baseline > Union Schemas > union with different raw/parsed discriminant generates correct AST 1`] = ` +"serialization.union(serialization.discriminant("animalType", "animal_type"), { + "dog": serialization.object({}) +})" +`; + exports[`ZurgImpl AST Generation Baseline > Collection Schemas > list() generates correct AST 1`] = `"serialization.list(serialization.string())"`; exports[`ZurgImpl AST Generation Baseline > Collection Schemas > nested list generates correct AST 1`] = `"serialization.list(serialization.list(serialization.string()))"`; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap new file mode 100644 index 000000000000..91df575331ef --- /dev/null +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap @@ -0,0 +1,52 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ZurgFormat AST Generation > Collection Schemas > list(string()) generates correct AST 1`] = `"serialization.list(serialization.string())"`; + +exports[`ZurgFormat AST Generation > Collection Schemas > record(string, any) generates correct AST 1`] = `"serialization.record(serialization.string(), serialization.any())"`; + +exports[`ZurgFormat AST Generation > Collection Schemas > set(number()) generates correct AST 1`] = `"serialization.set(serialization.number())"`; + +exports[`ZurgFormat AST Generation > Enum Schema > enum with values generates correct AST 1`] = `"serialization.enum_(["A", "B", "C"])"`; + +exports[`ZurgFormat AST Generation > Lazy Schemas > lazy() generates correct AST 1`] = `"serialization.lazy(() => serialization.string())"`; + +exports[`ZurgFormat AST Generation > Lazy Schemas > lazyObject() generates correct AST 1`] = ` +"serialization.lazyObject(() => serialization.object({ + "id": serialization.string() +}))" +`; + +exports[`ZurgFormat AST Generation > Object Schemas > empty object generates correct AST 1`] = `"serialization.object({})"`; + +exports[`ZurgFormat AST Generation > Object Schemas > object with different raw/parsed keys generates correct AST 1`] = ` +"serialization.object({ + "firstName": serialization.property("first_name", serialization.string()), + "lastName": serialization.property("last_name", serialization.string()) +})" +`; + +exports[`ZurgFormat AST Generation > Object Schemas > object with same raw/parsed keys generates correct AST 1`] = ` +"serialization.object({ + "name": serialization.string(), + "age": serialization.number() +})" +`; + +exports[`ZurgFormat AST Generation > Schema Modifiers > nullable() generates correct AST 1`] = `"serialization.string().nullable()"`; + +exports[`ZurgFormat AST Generation > Schema Modifiers > optional() generates correct AST 1`] = `"serialization.string().optional()"`; + +exports[`ZurgFormat AST Generation > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"serialization.string().optionalNullable()"`; + +exports[`ZurgFormat AST Generation > Union Schemas > discriminated union generates correct AST 1`] = ` +"serialization.union("type", { + "dog": serialization.object({ + "breed": serialization.string() + }), + "cat": serialization.object({ + "indoor": serialization.boolean() + }) +})" +`; + +exports[`ZurgFormat AST Generation > Union Schemas > undiscriminated union generates correct AST 1`] = `"serialization.undiscriminatedUnion([serialization.string(), serialization.number(), serialization.boolean()])"`; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts index fd6485b60487..ce5979eaa09c 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts @@ -3,7 +3,8 @@ import { ts } from "ts-morph"; import { performance } from "perf_hooks"; import { Reference } from "../../referencing"; -import { ZurgImpl } from "../../core-utilities/Zurg"; +import { ZurgFormat } from "../formats/ZurgFormat"; +import { CoreUtility } from "../../core-utilities/CoreUtility"; /** * Create a mock reference for testing @@ -35,11 +36,11 @@ function createMockReference(exportedName: string): Reference { } /** - * Create a ZurgImpl instance for testing + * Create a ZurgFormat instance for testing */ -function createZurg(): ZurgImpl { - return new ZurgImpl({ - getReferenceToExport: ({ exportedName }) => createMockReference(exportedName), +function createZurg(): ZurgFormat { + return new ZurgFormat({ + getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => createMockReference(exportedName), generateEndpointMetadata: false }); } @@ -103,7 +104,7 @@ function formatResult(result: BenchmarkResult): string { } describe("Zurg Performance Benchmarks", () => { - let zurg: ZurgImpl; + let zurg: ZurgFormat; beforeAll(() => { zurg = createZurg(); From 863e804b2c8476cdbca29910c33b773623ad3c2d Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:46:51 -0500 Subject: [PATCH 15/71] added backwards compatible interface and removed old zurg code --- .../utils/commons/src/core-utilities/Zurg.ts | 980 +----------------- 1 file changed, 32 insertions(+), 948 deletions(-) diff --git a/generators/typescript/utils/commons/src/core-utilities/Zurg.ts b/generators/typescript/utils/commons/src/core-utilities/Zurg.ts index b24d71afa05e..aee4d9d597e5 100644 --- a/generators/typescript/utils/commons/src/core-utilities/Zurg.ts +++ b/generators/typescript/utils/commons/src/core-utilities/Zurg.ts @@ -1,953 +1,37 @@ -import { ts } from "ts-morph"; - -import { Reference } from "../referencing"; -import { CoreUtility } from "./CoreUtility"; - -export interface SchemaOptions { - unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; - allowUnrecognizedUnionMembers?: boolean; - allowUnrecognizedEnumValues?: boolean; - skipValidation?: boolean; - omitUndefined?: boolean; - breadcrumbsPrefix?: string[]; -} - -export interface Zurg { - object: (properties: Zurg.Property[]) => Zurg.ObjectSchema; - objectWithoutOptionalProperties: (properties: Zurg.Property[]) => Zurg.ObjectSchema; - union: (args: Zurg.union.Args) => Zurg.ObjectLikeSchema; - undiscriminatedUnion: (schemas: Zurg.Schema[]) => Zurg.Schema; - list: (itemSchema: Zurg.Schema) => Zurg.Schema; - set: (itemSchema: Zurg.Schema) => Zurg.Schema; - record: (args: { keySchema: Zurg.Schema; valueSchema: Zurg.Schema }) => Zurg.Schema; - enum: (values: string[]) => Zurg.Schema; - string: () => Zurg.Schema; - stringLiteral: (literal: string) => Zurg.Schema; - booleanLiteral: (literal: boolean) => Zurg.Schema; - date: () => Zurg.Schema; - number: () => Zurg.Schema; - bigint: () => Zurg.Schema; - boolean: () => Zurg.Schema; - any: () => Zurg.Schema; - unknown: () => Zurg.Schema; - never: () => Zurg.Schema; - lazy: (schema: Zurg.Schema) => Zurg.Schema; - lazyObject: (schema: Zurg.Schema) => Zurg.ObjectSchema; - - Schema: { - _getReferenceToType: (args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => ts.TypeNode; - _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }) => Zurg.Schema; - _visitMaybeValid: ( - referenceToMaybeValid: ts.Expression, - visitor: { - valid: (referenceToValue: ts.Expression) => ts.Statement[]; - invalid: (referenceToErrors: ts.Expression) => ts.Statement[]; - } - ) => ts.Statement[]; - }; - - ObjectSchema: { - _getReferenceToType: (args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => ts.TypeNode; - }; - - MaybeValid: { - ok: "ok"; - - Valid: { - value: "value"; - }; - - Invalid: { - errors: "errors"; - }; - }; - - ValidationError: { - path: "path"; - message: "message"; - }; -} - +import { + AdditionalProperty, + ObjectLikeSchema, + ObjectSchema, + Property, + SchemaOptions, + SchemaWithUtils, + SerializationFormat, + SingleUnionType, + UnionArgs +} from "../serialization-pipeline/SerializationFormat"; + +// Re-export types from SerializationFormat for backward compatibility +export type { SchemaOptions }; + +/** + * Zurg is now a type alias for SerializationFormat. + * This maintains backward compatibility while allowing different serialization formats to be used. + */ +export type Zurg = SerializationFormat; + +/** + * Zurg namespace for backward compatibility with existing code. + * All types are aliased to their SerializationFormat equivalents. + */ export declare namespace Zurg { - interface Schema extends BaseSchema, SchemaUtils {} - - interface BaseSchema { - toExpression: () => ts.Expression; - isOptional: boolean; - isNullable: boolean; - } - - interface SchemaUtils { - parse: (raw: ts.Expression, opts: Required) => ts.Expression; - json: (parsed: ts.Expression, opts: Required) => ts.Expression; - parseOrThrow: (raw: ts.Expression, opts: Required) => ts.Expression; - jsonOrThrow: (parsed: ts.Expression, opts: Required) => ts.Expression; - nullable: () => Zurg.Schema; - optional: () => Zurg.Schema; - optionalNullable: () => Zurg.Schema; - transform: (args: { - newShape: ts.TypeNode | undefined; - transform: ts.Expression; - untransform: ts.Expression; - }) => Zurg.Schema; - } - - interface ObjectLikeSchema extends Schema, ObjectLikeUtils {} - - interface ObjectLikeUtils { - withParsedProperties: (properties: Zurg.AdditionalProperty[]) => Zurg.ObjectLikeSchema; - } - - interface AdditionalProperty { - key: string; - getValue: (args: { getReferenceToParsed: () => ts.Expression }) => ts.Expression; - } - - interface ObjectSchema extends Schema, ObjectLikeUtils, ObjectUtils {} - - interface ObjectUtils { - extend: (extension: Zurg.Schema) => ObjectSchema; - passthrough: () => ObjectSchema; - } - - interface Property { - key: { - parsed: string; - raw: string; - }; - value: Schema; - } + export { SchemaWithUtils as Schema }; + export { ObjectSchema }; + export { ObjectLikeSchema }; + export { AdditionalProperty }; + export { Property }; namespace union { - interface Args { - parsedDiscriminant: string; - rawDiscriminant: string; - singleUnionTypes: Zurg.union.SingleUnionType[]; - } - - interface SingleUnionType { - discriminantValue: string; - nonDiscriminantProperties: Zurg.ObjectSchema; - } + export { UnionArgs as Args }; + export { SingleUnionType }; } } - -export const MANIFEST: CoreUtility.Manifest = { - name: "schemas", - pathInCoreUtilities: { nameOnDisk: "schemas", exportDeclaration: { namespaceExport: "serialization" } }, - getFilesPatterns: () => { - return { patterns: ["src/core/schemas/**", "tests/unit/schemas/**"] }; - } -}; -export class ZurgImpl extends CoreUtility implements Zurg { - public readonly MANIFEST = MANIFEST; - - public object = this.withExportedName("object", (object) => (properties: Zurg.Property[]): Zurg.ObjectSchema => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(object.getExpression(), undefined, [ - this.constructObjectLiteralForProperties(properties) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - }); - - public objectWithoutOptionalProperties = this.withExportedName( - "objectWithoutOptionalProperties", - (objectWithoutOptionalProperties) => - (properties: Zurg.Property[]): Zurg.ObjectSchema => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(objectWithoutOptionalProperties.getExpression(), undefined, [ - this.constructObjectLiteralForProperties(properties) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - } - ); - - private constructObjectLiteralForProperties(properties: Zurg.Property[]): ts.ObjectLiteralExpression { - return ts.factory.createObjectLiteralExpression( - properties.map((property) => { - let value = property.value.toExpression(); - if (property.key.raw !== property.key.parsed) { - value = this.property(property.key.raw, value); - } - return ts.factory.createPropertyAssignment(ts.factory.createStringLiteral(property.key.parsed), value); - }), - true - ); - } - - private getObjectUtils(objectSchema: Zurg.BaseSchema): Zurg.ObjectUtils { - return { - extend: (extension) => this.extend(objectSchema, extension), - passthrough: () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - objectSchema.toExpression(), - ts.factory.createIdentifier("passthrough") - ), - undefined, - [] - ) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - } - }; - } - - private extend(objectSchema: Zurg.BaseSchema, extension: Zurg.BaseSchema): Zurg.ObjectSchema { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - objectSchema.toExpression(), - ts.factory.createIdentifier("extend") - ), - undefined, - [extension.toExpression()] - ) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - } - - private property = this.withExportedName( - "property", - (property) => - (rawValue: string, value: ts.Expression): ts.Expression => { - return ts.factory.createCallExpression(property.getExpression(), undefined, [ - ts.factory.createStringLiteral(rawValue), - value - ]); - } - ); - - private getObjectLikeUtils(objectLike: Zurg.BaseSchema): Zurg.ObjectLikeUtils { - return { - withParsedProperties: (additionalProperties: Zurg.AdditionalProperty[]) => - this.withParsedProperties(objectLike, additionalProperties) - }; - } - - private withParsedProperties( - objectLike: Zurg.BaseSchema, - additionalProperties: Zurg.AdditionalProperty[] - ): Zurg.ObjectLikeSchema { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - objectLike.toExpression(), - ts.factory.createIdentifier("withParsedProperties") - ), - undefined, - [ - ts.factory.createObjectLiteralExpression( - additionalProperties.map((property) => { - const parsedIdentifier = ts.factory.createIdentifier("parsed"); - const context = { didAccessParsed: false }; - const getReferenceToParsed = () => { - context.didAccessParsed = true; - return parsedIdentifier; - }; - - const value = property.getValue({ getReferenceToParsed }); - - return ts.factory.createPropertyAssignment( - property.key, - context.didAccessParsed - ? ts.factory.createArrowFunction( - undefined, - undefined, - [ - ts.factory.createParameterDeclaration( - undefined, - undefined, - undefined, - parsedIdentifier - ) - ], - undefined, - undefined, - value - ) - : ts.isCallExpression(value) - ? ts.factory.createArrowFunction( - undefined, - undefined, - [], - undefined, - undefined, - value - ) - : value - ); - }), - true - ) - ] - ) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema) - }; - } - - public union = this.withExportedName( - "union", - (union: Reference) => - ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: Zurg.union.Args): Zurg.ObjectLikeSchema => { - const discriminantArgument = - parsedDiscriminant === rawDiscriminant - ? ts.factory.createStringLiteral(parsedDiscriminant) - : this.discriminant({ parsedDiscriminant, rawDiscriminant }); - - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(union.getExpression(), undefined, [ - discriminantArgument, - ts.factory.createObjectLiteralExpression( - singleUnionTypes.map((singleUnionType) => - ts.factory.createPropertyAssignment( - ts.factory.createStringLiteral(singleUnionType.discriminantValue), - singleUnionType.nonDiscriminantProperties.toExpression() - ) - ), - true - ) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema) - }; - } - ); - - private discriminant = this.withExportedName( - "discriminant", - (discriminant) => - ({ - parsedDiscriminant, - rawDiscriminant - }: { - parsedDiscriminant: string; - rawDiscriminant: string; - }): ts.Expression => { - return ts.factory.createCallExpression(discriminant.getExpression(), undefined, [ - ts.factory.createStringLiteral(parsedDiscriminant), - ts.factory.createStringLiteral(rawDiscriminant) - ]); - } - ); - - public undiscriminatedUnion = this.withExportedName( - "undiscriminatedUnion", - (undiscriminatedUnion: Reference) => (schemas: Zurg.Schema[]) => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(undiscriminatedUnion.getExpression(), undefined, [ - ts.factory.createArrayLiteralExpression(schemas.map((schema) => schema.toExpression())) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - ); - - public list = this.withExportedName("list", (list: Reference) => (itemSchema: Zurg.Schema) => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(list.getExpression(), undefined, [itemSchema.toExpression()]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public set = this.withExportedName("set", (set: Reference) => (itemSchema: Zurg.Schema) => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(set.getExpression(), undefined, [itemSchema.toExpression()]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public record = this.withExportedName( - "record", - (record: Reference) => - ({ keySchema, valueSchema }: { keySchema: Zurg.Schema; valueSchema: Zurg.Schema }) => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(record.getExpression(), undefined, [ - keySchema.toExpression(), - valueSchema.toExpression() - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - ); - - public enum = this.withExportedName("enum_", (enum_: Reference) => (values: string[]) => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(enum_.getExpression(), undefined, [ - ts.factory.createArrayLiteralExpression( - values.map((value) => ts.factory.createStringLiteral(value)) - ) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public string = this.withExportedName("string", (string: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => ts.factory.createCallExpression(string.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public stringLiteral = this.withExportedName("stringLiteral", (stringLiteral: Reference) => (literal: string) => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(stringLiteral.getExpression(), undefined, [ - ts.factory.createStringLiteral(literal) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public booleanLiteral = this.withExportedName( - "booleanLiteral", - (booleanLiteral: Reference) => (literal: boolean) => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(booleanLiteral.getExpression(), undefined, [ - literal ? ts.factory.createTrue() : ts.factory.createFalse() - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - ); - - public number = this.withExportedName("number", (number: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => ts.factory.createCallExpression(number.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public bigint = this.withExportedName("bigint", (bigint: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => ts.factory.createCallExpression(bigint.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public boolean = this.withExportedName("boolean", (boolean: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => ts.factory.createCallExpression(boolean.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public date = this.withExportedName("date", (date: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => ts.factory.createCallExpression(date.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public any = this.withExportedName("any", (any: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: true, - toExpression: () => ts.factory.createCallExpression(any.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public unknown = this.withExportedName("unknown", (unknown: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: true, - isNullable: false, - toExpression: () => ts.factory.createCallExpression(unknown.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public never = this.withExportedName("never", (never: Reference) => () => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => ts.factory.createCallExpression(never.getExpression(), undefined, undefined) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - private getSchemaUtils(baseSchema: Zurg.BaseSchema): Zurg.SchemaUtils { - return { - nullable: () => this.nullable(baseSchema), - optional: () => this.optional(baseSchema), - optionalNullable: () => this.optionalNullable(baseSchema), - parse: (raw, opts) => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "parse"), - undefined, - [raw, ...this.constructSchemaOptionsArgs(opts)] - ), - json: (parsed, opts) => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "json"), - undefined, - [parsed, ...this.constructSchemaOptionsArgs(opts)] - ), - parseOrThrow: (raw, opts) => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "parseOrThrow"), - undefined, - [raw, ...this.constructSchemaOptionsArgs(opts)] - ), - jsonOrThrow: (parsed, opts) => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression(baseSchema.toExpression(), "jsonOrThrow"), - undefined, - [parsed, ...this.constructSchemaOptionsArgs(opts)] - ), - transform: ({ - newShape, - transform, - untransform - }: { - newShape: ts.TypeNode | undefined; - transform: ts.Expression; - untransform: ts.Expression; - }) => - this.transform(baseSchema, { - newShape, - transformer: this.Schema._fromTransformers({ transform, untransform }) - }) - }; - } - - private constructSchemaOptionsArgs(schemaOptions: Required): ts.Expression[] { - const properties: ts.ObjectLiteralElementLike[] = []; - - if (schemaOptions.unrecognizedObjectKeys !== "fail") { - properties.push( - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("unrecognizedObjectKeys"), - ts.factory.createStringLiteral(schemaOptions.unrecognizedObjectKeys) - ) - ); - } - if (schemaOptions.allowUnrecognizedUnionMembers) { - properties.push( - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("allowUnrecognizedUnionMembers"), - ts.factory.createTrue() - ) - ); - } - if (schemaOptions.allowUnrecognizedEnumValues) { - properties.push( - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("allowUnrecognizedEnumValues"), - ts.factory.createTrue() - ) - ); - } - if (schemaOptions.skipValidation) { - properties.push( - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("skipValidation"), - ts.factory.createTrue() - ) - ); - } - if (schemaOptions.omitUndefined) { - properties.push( - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("omitUndefined"), - ts.factory.createTrue() - ) - ); - } - if (schemaOptions.breadcrumbsPrefix.length > 0) { - properties.push( - ts.factory.createPropertyAssignment( - ts.factory.createIdentifier("breadcrumbsPrefix"), - ts.factory.createArrayLiteralExpression( - schemaOptions.breadcrumbsPrefix.map((breadcrumb) => ts.factory.createStringLiteral(breadcrumb)) - ) - ) - ); - } - - if (properties.length > 0) { - return [ts.factory.createObjectLiteralExpression(properties)]; - } else { - return []; - } - } - - private nullable(schema: Zurg.BaseSchema): Zurg.Schema { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: true, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - schema.toExpression(), - ts.factory.createIdentifier("nullable") - ), - undefined, - [] - ) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - - private optional(schema: Zurg.BaseSchema): Zurg.Schema { - const baseSchema: Zurg.BaseSchema = { - isOptional: true, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - schema.toExpression(), - ts.factory.createIdentifier("optional") - ), - undefined, - [] - ) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - - private optionalNullable(schema: Zurg.BaseSchema): Zurg.Schema { - const baseSchema: Zurg.BaseSchema = { - isOptional: true, - isNullable: true, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - schema.toExpression(), - ts.factory.createIdentifier("optionalNullable") - ), - undefined, - [] - ) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - - private transform( - schema: Zurg.BaseSchema, - { newShape, transformer }: { newShape: ts.TypeNode | undefined; transformer: Zurg.BaseSchema } - ): Zurg.Schema { - const baseSchema: Zurg.BaseSchema = { - isOptional: transformer.isOptional, - isNullable: transformer.isNullable, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - schema.toExpression(), - ts.factory.createIdentifier("transform") - ), - newShape != null ? [newShape] : undefined, - [transformer.toExpression()] - ) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - - public lazy = this.withExportedName("lazy", (lazy) => (schema: Zurg.Schema): Zurg.Schema => { - const baseSchema: Zurg.BaseSchema = { - isOptional: schema.isOptional, - isNullable: schema.isNullable, - toExpression: () => - ts.factory.createCallExpression(lazy.getExpression(), undefined, [ - ts.factory.createArrowFunction([], undefined, [], undefined, undefined, schema.toExpression()) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }); - - public lazyObject = this.withExportedName( - "lazyObject", - (lazyObject) => - (schema: Zurg.Schema): Zurg.ObjectSchema => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: schema.isNullable, - toExpression: () => - ts.factory.createCallExpression(lazyObject.getExpression(), undefined, [ - ts.factory.createArrowFunction( - [], - undefined, - [], - undefined, - undefined, - schema.toExpression() - ) - ]) - }; - - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - } - ); - - public Schema = { - _getReferenceToType: this.withExportedName( - "Schema", - (Schema) => - ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => - ts.factory.createTypeReferenceNode(Schema.getEntityName(), [rawShape, parsedShape]) - ), - - _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): Zurg.Schema => { - const baseSchema: Zurg.BaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => expression - }; - if (opts?.isObject) { - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - } - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - }, - - _fromTransformers: ({ - transform, - untransform - }: { - transform: ts.Expression; - untransform: ts.Expression; - }): Zurg.Schema => { - return this.Schema._fromExpression( - ts.factory.createObjectLiteralExpression( - [ - ts.factory.createPropertyAssignment("transform", transform), - ts.factory.createPropertyAssignment("untransform", untransform) - ], - true - ) - ); - }, - - _visitMaybeValid: ( - referenceToMaybeValid: ts.Expression, - visitor: { - valid: (referenceToValue: ts.Expression) => ts.Statement[]; - invalid: (referenceToErrors: ts.Expression) => ts.Statement[]; - } - ): ts.Statement[] => { - return [ - ts.factory.createIfStatement( - ts.factory.createPropertyAccessExpression(referenceToMaybeValid, this.MaybeValid.ok), - ts.factory.createBlock( - visitor.valid( - ts.factory.createPropertyAccessExpression( - referenceToMaybeValid, - this.MaybeValid.Valid.value - ) - ), - true - ), - ts.factory.createBlock( - visitor.invalid( - ts.factory.createPropertyAccessExpression( - referenceToMaybeValid, - this.MaybeValid.Invalid.errors - ) - ), - true - ) - ) - ]; - } - }; - - public ObjectSchema = { - _getReferenceToType: this.withExportedName( - "ObjectSchema", - (ObjectSchema) => - ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => - ts.factory.createTypeReferenceNode(ObjectSchema.getEntityName(), [rawShape, parsedShape]) - ) - }; - - public MaybeValid = { - ok: "ok" as const, - Valid: { - value: "value" as const - }, - Invalid: { - errors: "errors" as const - } - }; - - public ValidationError = { - path: "path" as const, - message: "message" as const - }; -} From 04a04a2bca468913cf371c998e7ec6293d2f9100 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 22:58:44 -0500 Subject: [PATCH 16/71] fixed for biome pr job --- .../express/cli/src/ExpressGeneratorCli.ts | 4 +- .../typescript/sdk/cli/src/SdkGeneratorCli.ts | 11 +- .../core-utilities/CoreUtilitiesManager.ts | 9 +- .../SerializationFormat.ts | 1 - .../SerializationPipeline.ts | 7 +- .../__tests__/SerializationPipeline.test.ts | 16 +- .../__tests__/ZodFormat.test.ts | 29 +- .../__tests__/ZurgBaseline.test.ts | 56 +- .../__tests__/ZurgFormat.test.ts | 12 +- .../__tests__/benchmark.test.ts | 479 ++++++++++-------- .../formats/NoneFormat.ts | 3 +- .../formats/ZodFormat.ts | 48 +- .../formats/ZurgFormat.ts | 51 +- .../serialization-pipeline/formats/index.ts | 5 +- .../src/serialization-pipeline/index.ts | 7 +- 15 files changed, 378 insertions(+), 360 deletions(-) diff --git a/generators/typescript/express/cli/src/ExpressGeneratorCli.ts b/generators/typescript/express/cli/src/ExpressGeneratorCli.ts index 2d2a96d6a23b..672d9d87eea2 100644 --- a/generators/typescript/express/cli/src/ExpressGeneratorCli.ts +++ b/generators/typescript/express/cli/src/ExpressGeneratorCli.ts @@ -12,14 +12,14 @@ import { ExpressCustomConfigSchema } from "./custom-config/schema/ExpressCustomC export class ExpressGeneratorCli extends AbstractGeneratorCli { protected parseCustomConfig(customConfig: unknown, logger: Logger): ExpressCustomConfig { const parsed = customConfig != null ? ExpressCustomConfigSchema.parse(customConfig) : undefined; - + // Resolve serialization format from new option or legacy noSerdeLayer const serializationFormat = SerializationPipeline.resolveFormatType({ serializationFormat: parsed?.serializationFormat, noSerdeLayer: parsed?.noSerdeLayer }); const noSerdeLayer = serializationFormat === "none"; - + const enableInlineTypes = false; // hardcode, not supported in Express const config = { useBrandedStringAliases: parsed?.useBrandedStringAliases ?? false, diff --git a/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts b/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts index a803e67b2d5e..618c7059418e 100644 --- a/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts +++ b/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts @@ -9,6 +9,7 @@ import { fixImportsForEsm, NpmPackage, PersistedTypescriptProject, + SerializationFormatType, SerializationPipeline, writeTemplateFiles } from "@fern-typescript/commons"; @@ -36,15 +37,19 @@ export class SdkGeneratorCli extends AbstractGeneratorCli { protected parseCustomConfig(customConfig: unknown, logger: Logger): SdkCustomConfig { const parsed = customConfig != null ? SdkCustomConfigSchema.parse(customConfig) : undefined; - + // Resolve serialization format from new option or legacy noSerdeLayer // Note: SDK defaults to noSerdeLayer: true (no serialization) for backward compatibility + // TODO: Add serializationFormat to TypescriptCustomConfigSchema in @fern-api/typescript-ast + const parsedWithFormat = parsed as + | (typeof parsed & { serializationFormat?: SerializationFormatType }) + | undefined; const serializationFormat = SerializationPipeline.resolveFormatType({ - serializationFormat: (parsed as any)?.serializationFormat, // TODO: Add to TypescriptCustomConfigSchema + serializationFormat: parsedWithFormat?.serializationFormat, noSerdeLayer: parsed?.noSerdeLayer ?? true }); const noSerdeLayer = serializationFormat === "none"; - + const config = { useBrandedStringAliases: parsed?.useBrandedStringAliases ?? false, outputSourceFiles: parsed?.outputSourceFiles ?? true, diff --git a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts index 5a319dc44857..27eb6676e699 100644 --- a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts +++ b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts @@ -13,8 +13,8 @@ import { SerializationFormatType, SerializationPipeline, ZodFormat, - ZurgFormat, - ZURG_MANIFEST + ZURG_MANIFEST, + ZurgFormat } from "../serialization-pipeline"; import { AuthImpl } from "./Auth"; import { CallbackQueueImpl } from "./CallbackQueue"; @@ -143,7 +143,10 @@ export class CoreUtilitiesManager { } private createSerializationFormat( - getReferenceToExport: (args: { manifest: CoreUtility.Manifest; exportedName: string }) => ReturnType + getReferenceToExport: (args: { + manifest: CoreUtility.Manifest; + exportedName: string; + }) => ReturnType ) { const config = { getReferenceToExport, diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts index e1bc60d0d828..e7eb420ebc5b 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts @@ -364,4 +364,3 @@ export interface SerializationFormatConfig { */ generateEndpointMetadata: boolean; } - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index a239b7210863..1dda37b65761 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -1,7 +1,7 @@ -import { SerializationFormat, SerializationFormatConfig } from "./SerializationFormat"; -import { ZurgFormat } from "./formats/ZurgFormat"; -import { ZodFormat } from "./formats/ZodFormat"; import { NoneFormat } from "./formats/NoneFormat"; +import { ZodFormat } from "./formats/ZodFormat"; +import { ZurgFormat } from "./formats/ZurgFormat"; +import { SerializationFormat, SerializationFormatConfig } from "./SerializationFormat"; /** * Supported serialization format types @@ -111,4 +111,3 @@ export class SerializationPipeline { return "default"; } } - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts index 6b3925dd1aff..096bd8a1448f 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts @@ -1,11 +1,11 @@ -import { describe, expect, it } from "vitest"; import { ts } from "ts-morph"; +import { describe, expect, it } from "vitest"; import { Reference } from "../../referencing"; -import { SerializationPipeline } from "../SerializationPipeline"; -import { ZurgFormat } from "../formats/ZurgFormat"; -import { ZodFormat } from "../formats/ZodFormat"; import { NoneFormat } from "../formats/NoneFormat"; +import { ZodFormat } from "../formats/ZodFormat"; +import { ZurgFormat } from "../formats/ZurgFormat"; +import { SerializationPipeline } from "../SerializationPipeline"; /** * Create a mock reference for testing @@ -189,9 +189,7 @@ describe("SerializationPipeline", () => { }); const format = pipeline.getFormat(); - const schema = format.object([ - { key: { parsed: "name", raw: "name" }, value: format.string() } - ]); + const schema = format.object([{ key: { parsed: "name", raw: "name" }, value: format.string() }]); const expr = schema.toExpression(); expect(expr).toBeDefined(); @@ -207,9 +205,7 @@ describe("SerializationPipeline", () => { }); const format = pipeline.getFormat(); - const schema = format.object([ - { key: { parsed: "name", raw: "name" }, value: format.string() } - ]); + const schema = format.object([{ key: { parsed: "name", raw: "name" }, value: format.string() }]); const expr = schema.toExpression(); expect(expr).toBeDefined(); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index b020aeb66b30..996bc0929c48 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -1,5 +1,5 @@ -import { describe, expect, it } from "vitest"; import { ts } from "ts-morph"; +import { describe, expect, it } from "vitest"; import { Reference } from "../../referencing"; import { ZodFormat } from "../formats/ZodFormat"; @@ -160,17 +160,13 @@ describe("ZodFormat AST Generation", () => { }); it("object with nullable property", () => { - const schema = zod.object([ - { key: { parsed: "name", raw: "name" }, value: zod.string().nullable() } - ]); + const schema = zod.object([{ key: { parsed: "name", raw: "name" }, value: zod.string().nullable() }]); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); }); it("object.passthrough()", () => { - const schema = zod.object([ - { key: { parsed: "id", raw: "id" }, value: zod.string() } - ]).passthrough(); + const schema = zod.object([{ key: { parsed: "id", raw: "id" }, value: zod.string() }]).passthrough(); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); }); @@ -252,9 +248,7 @@ describe("ZodFormat AST Generation", () => { }); it("lazyObject() generates z.lazy()", () => { - const schema = zod.lazyObject( - zod.object([{ key: { parsed: "id", raw: "id" }, value: zod.string() }]) - ); + const schema = zod.lazyObject(zod.object([{ key: { parsed: "id", raw: "id" }, value: zod.string() }])); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); }); @@ -313,20 +307,14 @@ describe("ZodFormat AST Generation", () => { const statements = zod.Schema._visitMaybeValid(maybeValidRef, { valid: (valueRef) => [ ts.factory.createExpressionStatement( - ts.factory.createCallExpression( - ts.factory.createIdentifier("console.log"), - undefined, - [valueRef] - ) + ts.factory.createCallExpression(ts.factory.createIdentifier("console.log"), undefined, [ + valueRef + ]) ) ], invalid: (errorsRef) => [ ts.factory.createThrowStatement( - ts.factory.createNewExpression( - ts.factory.createIdentifier("Error"), - undefined, - [errorsRef] - ) + ts.factory.createNewExpression(ts.factory.createIdentifier("Error"), undefined, [errorsRef]) ) ] }); @@ -357,4 +345,3 @@ describe("ZodFormat AST Generation", () => { }); }); }); - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts index 941a1b95ee15..72a069b0b6cc 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts @@ -1,9 +1,8 @@ -import { describe, expect, it } from "vitest"; import { ts } from "ts-morph"; - -import { Reference } from "../../referencing"; -import { ZurgFormat, ZURG_MANIFEST } from "../formats/ZurgFormat"; +import { describe, expect, it } from "vitest"; import { CoreUtility } from "../../core-utilities/CoreUtility"; +import { Reference } from "../../referencing"; +import { ZURG_MANIFEST, ZurgFormat } from "../formats/ZurgFormat"; /** * Helper to print TypeScript AST to string for snapshot comparison @@ -49,7 +48,8 @@ function createMockReference(exportedName: string): Reference { */ function createZurg(): ZurgFormat { return new ZurgFormat({ - getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => createMockReference(exportedName), + getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => + createMockReference(exportedName), generateEndpointMetadata: false }); } @@ -162,9 +162,7 @@ describe("ZurgFormat AST Generation Baseline", () => { }); it("object with nullable property generates correct AST", () => { - const schema = zurg.object([ - { key: { parsed: "name", raw: "name" }, value: zurg.string().nullable() } - ]); + const schema = zurg.object([{ key: { parsed: "name", raw: "name" }, value: zurg.string().nullable() }]); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); }); @@ -178,9 +176,7 @@ describe("ZurgFormat AST Generation Baseline", () => { }); it("object.extend() generates correct AST", () => { - const baseSchema = zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() } - ]); + const baseSchema = zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]); const extendedSchema = baseSchema.extend( zurg.object([{ key: { parsed: "name", raw: "name" }, value: zurg.string() }]) ); @@ -189,9 +185,7 @@ describe("ZurgFormat AST Generation Baseline", () => { }); it("object.passthrough() generates correct AST", () => { - const schema = zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() } - ]).passthrough(); + const schema = zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]).passthrough(); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); }); @@ -294,9 +288,7 @@ describe("ZurgFormat AST Generation Baseline", () => { }); it("lazyObject() generates correct AST", () => { - const schema = zurg.lazyObject( - zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]) - ); + const schema = zurg.lazyObject(zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }])); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); }); @@ -384,9 +376,7 @@ describe("ZurgFormat AST Generation Baseline", () => { }); it("parse() with skipValidation generates correct AST", () => { - const schema = zurg.object([ - { key: { parsed: "name", raw: "name" }, value: zurg.string() } - ]); + const schema = zurg.object([{ key: { parsed: "name", raw: "name" }, value: zurg.string() }]); const rawExpr = ts.factory.createIdentifier("rawValue"); const parseExpr = schema.parse(rawExpr, { unrecognizedObjectKeys: "passthrough", @@ -439,20 +429,14 @@ describe("ZurgFormat AST Generation Baseline", () => { const statements = zurg.Schema._visitMaybeValid(maybeValidRef, { valid: (valueRef: ts.Expression) => [ ts.factory.createExpressionStatement( - ts.factory.createCallExpression( - ts.factory.createIdentifier("console.log"), - undefined, - [valueRef] - ) + ts.factory.createCallExpression(ts.factory.createIdentifier("console.log"), undefined, [ + valueRef + ]) ) ], invalid: (errorsRef: ts.Expression) => [ ts.factory.createThrowStatement( - ts.factory.createNewExpression( - ts.factory.createIdentifier("Error"), - undefined, - [errorsRef] - ) + ts.factory.createNewExpression(ts.factory.createIdentifier("Error"), undefined, [errorsRef]) ) ] }); @@ -468,10 +452,13 @@ describe("ZurgFormat AST Generation Baseline", () => { { key: { parsed: "user", raw: "user" }, value: zurg.object([ - { key: { parsed: "profile", raw: "profile" }, value: zurg.object([ - { key: { parsed: "name", raw: "name" }, value: zurg.string() }, - { key: { parsed: "age", raw: "age" }, value: zurg.number().optional() } - ])} + { + key: { parsed: "profile", raw: "profile" }, + value: zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number().optional() } + ]) + } ]) }, { @@ -488,4 +475,3 @@ describe("ZurgFormat AST Generation Baseline", () => { }); }); }); - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts index dc4df2764ff5..03d453808733 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts @@ -1,9 +1,8 @@ -import { describe, expect, it } from "vitest"; import { ts } from "ts-morph"; - +import { describe, expect, it } from "vitest"; +import { CoreUtility } from "../../core-utilities/CoreUtility"; import { Reference } from "../../referencing"; import { ZurgFormat } from "../formats/ZurgFormat"; -import { CoreUtility } from "../../core-utilities/CoreUtility"; /** * Helper to print TypeScript AST to string for comparison @@ -48,7 +47,8 @@ function createMockReference(exportedName: string): Reference { */ function createZurgFormat(): ZurgFormat { return new ZurgFormat({ - getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => createMockReference(exportedName), + getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => + createMockReference(exportedName), generateEndpointMetadata: false }); } @@ -165,9 +165,7 @@ describe("ZurgFormat AST Generation", () => { }); it("record(string, any) generates correct AST", () => { - const ast = printNode( - zurg.record({ keySchema: zurg.string(), valueSchema: zurg.any() }).toExpression() - ); + const ast = printNode(zurg.record({ keySchema: zurg.string(), valueSchema: zurg.any() }).toExpression()); expect(ast).toMatchSnapshot(); }); }); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts index ce5979eaa09c..5ca3a6685924 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/benchmark.test.ts @@ -1,10 +1,9 @@ -import { describe, it, expect, beforeAll } from "vitest"; -import { ts } from "ts-morph"; import { performance } from "perf_hooks"; - +import { ts } from "ts-morph"; +import { beforeAll, describe, expect, it } from "vitest"; +import { CoreUtility } from "../../core-utilities/CoreUtility"; import { Reference } from "../../referencing"; import { ZurgFormat } from "../formats/ZurgFormat"; -import { CoreUtility } from "../../core-utilities/CoreUtility"; /** * Create a mock reference for testing @@ -40,7 +39,8 @@ function createMockReference(exportedName: string): Reference { */ function createZurg(): ZurgFormat { return new ZurgFormat({ - getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => createMockReference(exportedName), + getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => + createMockReference(exportedName), generateEndpointMetadata: false }); } @@ -112,27 +112,39 @@ describe("Zurg Performance Benchmarks", () => { describe("Primitive Schema Creation", () => { it("string() creation performance", () => { - const result = benchmark("string()", () => { - zurg.string(); - }, 10000); + const result = benchmark( + "string()", + () => { + zurg.string(); + }, + 10000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(1); // Should be sub-millisecond }); it("number() creation performance", () => { - const result = benchmark("number()", () => { - zurg.number(); - }, 10000); + const result = benchmark( + "number()", + () => { + zurg.number(); + }, + 10000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(1); }); it("boolean() creation performance", () => { - const result = benchmark("boolean()", () => { - zurg.boolean(); - }, 10000); + const result = benchmark( + "boolean()", + () => { + zurg.boolean(); + }, + 10000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(1); @@ -141,48 +153,63 @@ describe("Zurg Performance Benchmarks", () => { describe("Object Schema Creation", () => { it("simple object (3 properties) creation performance", () => { - const result = benchmark("object (3 props)", () => { - zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() }, - { key: { parsed: "name", raw: "name" }, value: zurg.string() }, - { key: { parsed: "age", raw: "age" }, value: zurg.number() } - ]); - }, 5000); + const result = benchmark( + "object (3 props)", + () => { + zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number() } + ]); + }, + 5000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(5); }); it("medium object (10 properties) creation performance", () => { - const result = benchmark("object (10 props)", () => { - zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() }, - { key: { parsed: "name", raw: "name" }, value: zurg.string() }, - { key: { parsed: "email", raw: "email" }, value: zurg.string() }, - { key: { parsed: "age", raw: "age" }, value: zurg.number() }, - { key: { parsed: "active", raw: "active" }, value: zurg.boolean() }, - { key: { parsed: "createdAt", raw: "created_at" }, value: zurg.date() }, - { key: { parsed: "updatedAt", raw: "updated_at" }, value: zurg.date() }, - { key: { parsed: "role", raw: "role" }, value: zurg.enum(["admin", "user", "guest"]) }, - { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) }, - { key: { parsed: "metadata", raw: "metadata" }, value: zurg.record({ keySchema: zurg.string(), valueSchema: zurg.any() }) } - ]); - }, 2000); + const result = benchmark( + "object (10 props)", + () => { + zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "email", raw: "email" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number() }, + { key: { parsed: "active", raw: "active" }, value: zurg.boolean() }, + { key: { parsed: "createdAt", raw: "created_at" }, value: zurg.date() }, + { key: { parsed: "updatedAt", raw: "updated_at" }, value: zurg.date() }, + { key: { parsed: "role", raw: "role" }, value: zurg.enum(["admin", "user", "guest"]) }, + { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) }, + { + key: { parsed: "metadata", raw: "metadata" }, + value: zurg.record({ keySchema: zurg.string(), valueSchema: zurg.any() }) + } + ]); + }, + 2000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(10); }); it("object with property renaming performance", () => { - const result = benchmark("object (renamed props)", () => { - zurg.object([ - { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, - { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() }, - { key: { parsed: "emailAddress", raw: "email_address" }, value: zurg.string() }, - { key: { parsed: "phoneNumber", raw: "phone_number" }, value: zurg.string() }, - { key: { parsed: "dateOfBirth", raw: "date_of_birth" }, value: zurg.date() } - ]); - }, 3000); + const result = benchmark( + "object (renamed props)", + () => { + zurg.object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() }, + { key: { parsed: "emailAddress", raw: "email_address" }, value: zurg.string() }, + { key: { parsed: "phoneNumber", raw: "phone_number" }, value: zurg.string() }, + { key: { parsed: "dateOfBirth", raw: "date_of_birth" }, value: zurg.date() } + ]); + }, + 3000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(5); @@ -191,47 +218,55 @@ describe("Zurg Performance Benchmarks", () => { describe("Union Schema Creation", () => { it("discriminated union (3 variants) creation performance", () => { - const result = benchmark("union (3 variants)", () => { - zurg.union({ - parsedDiscriminant: "type", - rawDiscriminant: "type", - singleUnionTypes: [ - { - discriminantValue: "dog", - nonDiscriminantProperties: zurg.object([ - { key: { parsed: "breed", raw: "breed" }, value: zurg.string() } - ]) - }, - { - discriminantValue: "cat", - nonDiscriminantProperties: zurg.object([ - { key: { parsed: "indoor", raw: "indoor" }, value: zurg.boolean() } - ]) - }, - { - discriminantValue: "bird", - nonDiscriminantProperties: zurg.object([ - { key: { parsed: "canFly", raw: "can_fly" }, value: zurg.boolean() } - ]) - } - ] - }); - }, 2000); + const result = benchmark( + "union (3 variants)", + () => { + zurg.union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "dog", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "breed", raw: "breed" }, value: zurg.string() } + ]) + }, + { + discriminantValue: "cat", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "indoor", raw: "indoor" }, value: zurg.boolean() } + ]) + }, + { + discriminantValue: "bird", + nonDiscriminantProperties: zurg.object([ + { key: { parsed: "canFly", raw: "can_fly" }, value: zurg.boolean() } + ]) + } + ] + }); + }, + 2000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(10); }); it("undiscriminated union (5 types) creation performance", () => { - const result = benchmark("undiscriminatedUnion (5 types)", () => { - zurg.undiscriminatedUnion([ - zurg.string(), - zurg.number(), - zurg.boolean(), - zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]), - zurg.list(zurg.string()) - ]); - }, 3000); + const result = benchmark( + "undiscriminatedUnion (5 types)", + () => { + zurg.undiscriminatedUnion([ + zurg.string(), + zurg.number(), + zurg.boolean(), + zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]), + zurg.list(zurg.string()) + ]); + }, + 3000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(5); @@ -240,32 +275,42 @@ describe("Zurg Performance Benchmarks", () => { describe("Collection Schema Creation", () => { it("list schema creation performance", () => { - const result = benchmark("list(string())", () => { - zurg.list(zurg.string()); - }, 5000); + const result = benchmark( + "list(string())", + () => { + zurg.list(zurg.string()); + }, + 5000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); }); it("nested list schema creation performance", () => { - const result = benchmark("list(list(string()))", () => { - zurg.list(zurg.list(zurg.string())); - }, 3000); + const result = benchmark( + "list(list(string()))", + () => { + zurg.list(zurg.list(zurg.string())); + }, + 3000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(3); }); it("record schema creation performance", () => { - const result = benchmark("record(string, object)", () => { - zurg.record({ - keySchema: zurg.string(), - valueSchema: zurg.object([ - { key: { parsed: "name", raw: "name" }, value: zurg.string() } - ]) - }); - }, 3000); + const result = benchmark( + "record(string, object)", + () => { + zurg.record({ + keySchema: zurg.string(), + valueSchema: zurg.object([{ key: { parsed: "name", raw: "name" }, value: zurg.string() }]) + }); + }, + 3000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(5); @@ -279,9 +324,13 @@ describe("Zurg Performance Benchmarks", () => { { key: { parsed: "name", raw: "name" }, value: zurg.string() } ]); - const result = benchmark("object.toExpression()", () => { - schema.toExpression(); - }, 5000); + const result = benchmark( + "object.toExpression()", + () => { + schema.toExpression(); + }, + 5000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(1); @@ -293,11 +342,14 @@ describe("Zurg Performance Benchmarks", () => { key: { parsed: "user", raw: "user" }, value: zurg.object([ { key: { parsed: "id", raw: "id" }, value: zurg.string() }, - { key: { parsed: "profile", raw: "profile" }, value: zurg.object([ - { key: { parsed: "name", raw: "name" }, value: zurg.string() }, - { key: { parsed: "age", raw: "age" }, value: zurg.number().optional() }, - { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) } - ])} + { + key: { parsed: "profile", raw: "profile" }, + value: zurg.object([ + { key: { parsed: "name", raw: "name" }, value: zurg.string() }, + { key: { parsed: "age", raw: "age" }, value: zurg.number().optional() }, + { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) } + ]) + } ]) }, { @@ -306,9 +358,13 @@ describe("Zurg Performance Benchmarks", () => { } ]); - const result = benchmark("complex.toExpression()", () => { - schema.toExpression(); - }, 2000); + const result = benchmark( + "complex.toExpression()", + () => { + schema.toExpression(); + }, + 2000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); @@ -317,61 +373,71 @@ describe("Zurg Performance Benchmarks", () => { describe("Schema Operations", () => { it("optional() chain performance", () => { - const result = benchmark("string().optional()", () => { - zurg.string().optional(); - }, 5000); + const result = benchmark( + "string().optional()", + () => { + zurg.string().optional(); + }, + 5000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); }); it("nullable() chain performance", () => { - const result = benchmark("string().nullable()", () => { - zurg.string().nullable(); - }, 5000); + const result = benchmark( + "string().nullable()", + () => { + zurg.string().nullable(); + }, + 5000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); }); it("object.extend() performance", () => { - const baseSchema = zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() } - ]); + const baseSchema = zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]); - const result = benchmark("object.extend()", () => { - baseSchema.extend( - zurg.object([ - { key: { parsed: "name", raw: "name" }, value: zurg.string() } - ]) - ); - }, 3000); + const result = benchmark( + "object.extend()", + () => { + baseSchema.extend(zurg.object([{ key: { parsed: "name", raw: "name" }, value: zurg.string() }])); + }, + 3000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(5); }); it("lazy() wrapper performance", () => { - const innerSchema = zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() } - ]); + const innerSchema = zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]); - const result = benchmark("lazy()", () => { - zurg.lazy(innerSchema); - }, 5000); + const result = benchmark( + "lazy()", + () => { + zurg.lazy(innerSchema); + }, + 5000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); }); it("lazyObject() wrapper performance", () => { - const innerSchema = zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() } - ]); + const innerSchema = zurg.object([{ key: { parsed: "id", raw: "id" }, value: zurg.string() }]); - const result = benchmark("lazyObject()", () => { - zurg.lazyObject(innerSchema); - }, 5000); + const result = benchmark( + "lazyObject()", + () => { + zurg.lazyObject(innerSchema); + }, + 5000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); @@ -386,16 +452,20 @@ describe("Zurg Performance Benchmarks", () => { ]); const rawExpr = ts.factory.createIdentifier("raw"); - const result = benchmark("schema.parse()", () => { - schema.parse(rawExpr, { - unrecognizedObjectKeys: "fail", - allowUnrecognizedUnionMembers: false, - allowUnrecognizedEnumValues: false, - skipValidation: false, - omitUndefined: false, - breadcrumbsPrefix: [] - }); - }, 3000); + const result = benchmark( + "schema.parse()", + () => { + schema.parse(rawExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + }, + 3000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); @@ -408,16 +478,20 @@ describe("Zurg Performance Benchmarks", () => { ]); const parsedExpr = ts.factory.createIdentifier("parsed"); - const result = benchmark("schema.json()", () => { - schema.json(parsedExpr, { - unrecognizedObjectKeys: "fail", - allowUnrecognizedUnionMembers: false, - allowUnrecognizedEnumValues: false, - skipValidation: false, - omitUndefined: false, - breadcrumbsPrefix: [] - }); - }, 3000); + const result = benchmark( + "schema.json()", + () => { + schema.json(parsedExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false, + breadcrumbsPrefix: [] + }); + }, + 3000 + ); console.log(formatResult(result)); expect(result.avgTimeMs).toBeLessThan(2); @@ -426,55 +500,59 @@ describe("Zurg Performance Benchmarks", () => { describe("Realistic Workload Simulation", () => { it("simulate generating schemas for 100 types", () => { - const result = benchmark("100 type schemas", () => { - // Simulate a mix of types that might be in a real API - for (let i = 0; i < 100; i++) { - const typeIndex = i % 5; - switch (typeIndex) { - case 0: - // Simple object - zurg.object([ - { key: { parsed: "id", raw: "id" }, value: zurg.string() }, - { key: { parsed: "value", raw: "value" }, value: zurg.number() } - ]); - break; - case 1: - // Enum - zurg.enum(["A", "B", "C"]); - break; - case 2: - // List - zurg.list(zurg.string()); - break; - case 3: - // Union - zurg.union({ - parsedDiscriminant: "type", - rawDiscriminant: "type", - singleUnionTypes: [ - { - discriminantValue: "a", - nonDiscriminantProperties: zurg.object([]) - }, - { - discriminantValue: "b", - nonDiscriminantProperties: zurg.object([]) - } - ] - }); - break; - case 4: - // Complex object - zurg.object([ - { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, - { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() }, - { key: { parsed: "email", raw: "email" }, value: zurg.string().optional() }, - { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) } - ]); - break; + const result = benchmark( + "100 type schemas", + () => { + // Simulate a mix of types that might be in a real API + for (let i = 0; i < 100; i++) { + const typeIndex = i % 5; + switch (typeIndex) { + case 0: + // Simple object + zurg.object([ + { key: { parsed: "id", raw: "id" }, value: zurg.string() }, + { key: { parsed: "value", raw: "value" }, value: zurg.number() } + ]); + break; + case 1: + // Enum + zurg.enum(["A", "B", "C"]); + break; + case 2: + // List + zurg.list(zurg.string()); + break; + case 3: + // Union + zurg.union({ + parsedDiscriminant: "type", + rawDiscriminant: "type", + singleUnionTypes: [ + { + discriminantValue: "a", + nonDiscriminantProperties: zurg.object([]) + }, + { + discriminantValue: "b", + nonDiscriminantProperties: zurg.object([]) + } + ] + }); + break; + case 4: + // Complex object + zurg.object([ + { key: { parsed: "firstName", raw: "first_name" }, value: zurg.string() }, + { key: { parsed: "lastName", raw: "last_name" }, value: zurg.string() }, + { key: { parsed: "email", raw: "email" }, value: zurg.string().optional() }, + { key: { parsed: "tags", raw: "tags" }, value: zurg.list(zurg.string()) } + ]); + break; + } } - } - }, 100); + }, + 100 + ); console.log(formatResult(result)); // 100 types should complete in reasonable time @@ -482,4 +560,3 @@ describe("Zurg Performance Benchmarks", () => { }); }); }); - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts index 39accd2e71a5..35fdc5b805ee 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts @@ -5,11 +5,11 @@ import { ObjectLikeSchema, ObjectSchema, Property, + Schema, SchemaOptions, SchemaWithUtils, SerializationFormat, SerializationFormatConfig, - Schema, UnionArgs } from "../SerializationFormat"; @@ -120,4 +120,3 @@ export class NoneFormat implements SerializationFormat { return null; // No runtime files needed } } - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index bc46a5c116f5..84edda0a55b3 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -5,11 +5,11 @@ import { ObjectLikeSchema, ObjectSchema, Property, + Schema, SchemaOptions, SchemaWithUtils, SerializationFormat, SerializationFormatConfig, - Schema, UnionArgs } from "../SerializationFormat"; @@ -316,9 +316,7 @@ export class ZodFormat implements SerializationFormat { // Get the properties from the non-discriminant schema // We need to merge them with the discriminant return chainMethod( - zodCall("object", [ - ts.factory.createObjectLiteralExpression([discriminantProp], false) - ]), + zodCall("object", [ts.factory.createObjectLiteralExpression([discriminantProp], false)]), "merge", [variant.nonDiscriminantProperties.toExpression()] ); @@ -489,8 +487,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - zodCall("literal", [literal ? ts.factory.createTrue() : ts.factory.createFalse()]) + toExpression: () => zodCall("literal", [literal ? ts.factory.createTrue() : ts.factory.createFalse()]) }; return { @@ -546,24 +543,18 @@ export class ZodFormat implements SerializationFormat { isNullable: false, toExpression: () => { // Use z.string() with transform to parse ISO strings to Date - return chainMethod( - zodCall("string"), - "transform", - [ - ts.factory.createArrowFunction( - undefined, - undefined, - [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "s")], - undefined, - ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), - ts.factory.createNewExpression( - ts.factory.createIdentifier("Date"), - undefined, - [ts.factory.createIdentifier("s")] - ) - ) - ] - ); + return chainMethod(zodCall("string"), "transform", [ + ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "s")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createNewExpression(ts.factory.createIdentifier("Date"), undefined, [ + ts.factory.createIdentifier("s") + ]) + ) + ]); } }; @@ -706,15 +697,11 @@ export class ZodFormat implements SerializationFormat { ts.factory.createIfStatement( ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "success"), ts.factory.createBlock( - visitor.valid( - ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "data") - ), + visitor.valid(ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "data")), true ), ts.factory.createBlock( - visitor.invalid( - ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "error") - ), + visitor.invalid(ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "error")), true ) ) @@ -768,4 +755,3 @@ export class ZodFormat implements SerializationFormat { return null; } } - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index 67a16ba5b50d..a5b637962c99 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -1,19 +1,18 @@ import { ts } from "ts-morph"; - -import { Reference } from "../../referencing"; import { CoreUtility } from "../../core-utilities/CoreUtility"; +import { Reference } from "../../referencing"; import { AdditionalProperty, ObjectLikeSchema, ObjectSchema, Property, + Schema, SchemaOptions, SchemaWithUtils, SerializationFormat, SerializationFormatConfig, SingleUnionType, - UnionArgs, - Schema + UnionArgs } from "../SerializationFormat"; /** @@ -762,34 +761,23 @@ export class ZurgFormat implements SerializationFormat { }; }); - public lazyObject = this.withExportedName( - "lazyObject", - (lazyObject) => - (schema: Schema): ObjectSchema => { - const baseSchema: ZurgBaseSchema = { - isOptional: false, - isNullable: schema.isNullable, - toExpression: () => - ts.factory.createCallExpression(lazyObject.getExpression(), undefined, [ - ts.factory.createArrowFunction( - [], - undefined, - [], - undefined, - undefined, - schema.toExpression() - ) - ]) - }; + public lazyObject = this.withExportedName("lazyObject", (lazyObject) => (schema: Schema): ObjectSchema => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: schema.isNullable, + toExpression: () => + ts.factory.createCallExpression(lazyObject.getExpression(), undefined, [ + ts.factory.createArrowFunction([], undefined, [], undefined, undefined, schema.toExpression()) + ]) + }; - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - } - ); + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + }); // ==================== Type Utilities ==================== @@ -911,4 +899,3 @@ export class ZurgFormat implements SerializationFormat { return { patterns: ["src/core/schemas/**", "tests/unit/schemas/**"] }; } } - diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts index 1286fd8ad8d0..c0820b23adf7 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts @@ -1,4 +1,3 @@ -export { ZurgFormat, ZURG_MANIFEST } from "./ZurgFormat"; -export { ZodFormat } from "./ZodFormat"; export { NoneFormat } from "./NoneFormat"; - +export { ZodFormat } from "./ZodFormat"; +export { ZURG_MANIFEST, ZurgFormat } from "./ZurgFormat"; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts index 0629438e36dc..3a7bbe8c8f0a 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/index.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts @@ -1,3 +1,4 @@ +export { NoneFormat, ZodFormat, ZURG_MANIFEST, ZurgFormat } from "./formats"; export { type AdditionalProperty, type ObjectLikeSchema, @@ -12,12 +13,8 @@ export { type SingleUnionType, type UnionArgs } from "./SerializationFormat"; - export { - SerializationPipeline, type SerializationFormatType, + SerializationPipeline, type SerializationPipelineConfig } from "./SerializationPipeline"; - -export { ZurgFormat, ZURG_MANIFEST, ZodFormat, NoneFormat } from "./formats"; - From 42d254bc7e2dd5a6b5a3b43ebd89cd61dcafd2cf Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 23:00:57 -0500 Subject: [PATCH 17/71] fixed sorted import --- generators/typescript/utils/commons/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/utils/commons/src/index.ts b/generators/typescript/utils/commons/src/index.ts index e94e583cd3c3..62ba92fa214f 100644 --- a/generators/typescript/utils/commons/src/index.ts +++ b/generators/typescript/utils/commons/src/index.ts @@ -33,8 +33,8 @@ export { type PackageId } from "./PackageId"; export * from "./public-exports-manager"; export * from "./referencing"; export { removeUndefinedAndNullFromTypeNode } from "./removeUndefinedAndNullFromTypeNode"; -export { type TypeReferenceNode } from "./TypeReferenceNode"; export * from "./serialization-pipeline"; +export { type TypeReferenceNode } from "./TypeReferenceNode"; export * from "./typescript-project"; export { convertJestImportsToVitest } from "./typescript-project/convertJestImportsToVitest"; export { fixImportsForEsm } from "./typescript-project/fixImportsForEsm"; From 7016a33613ba9247474acda7d2c33061264c5e19 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 23:09:03 -0500 Subject: [PATCH 18/71] fixed export --- generators/typescript/utils/commons/src/core-utilities/Zurg.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/utils/commons/src/core-utilities/Zurg.ts b/generators/typescript/utils/commons/src/core-utilities/Zurg.ts index aee4d9d597e5..2a12af00d725 100644 --- a/generators/typescript/utils/commons/src/core-utilities/Zurg.ts +++ b/generators/typescript/utils/commons/src/core-utilities/Zurg.ts @@ -30,7 +30,7 @@ export declare namespace Zurg { export { AdditionalProperty }; export { Property }; - namespace union { + export namespace union { export { UnionArgs as Args }; export { SingleUnionType }; } From 8a6c730e5d70c7eb444b3d9b66973142d975dadb Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 23:16:03 -0500 Subject: [PATCH 19/71] removed old zurg tests --- .../__snapshots__/ZurgBaseline.test.ts.snap | 164 ------------------ 1 file changed, 164 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap index 8b479218d6f9..62293a768413 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap @@ -163,167 +163,3 @@ exports[`ZurgFormat AST Generation Baseline > Union Schemas > union with differe "dog": serialization.object({}) })" `; - -exports[`ZurgImpl AST Generation Baseline > Collection Schemas > list() generates correct AST 1`] = `"serialization.list(serialization.string())"`; - -exports[`ZurgImpl AST Generation Baseline > Collection Schemas > nested list generates correct AST 1`] = `"serialization.list(serialization.list(serialization.string()))"`; - -exports[`ZurgImpl AST Generation Baseline > Collection Schemas > record() generates correct AST 1`] = `"serialization.record(serialization.string(), serialization.number())"`; - -exports[`ZurgImpl AST Generation Baseline > Collection Schemas > set() generates correct AST 1`] = `"serialization.set(serialization.number())"`; - -exports[`ZurgImpl AST Generation Baseline > Complex Nested Schemas > deeply nested object generates correct AST 1`] = ` -"serialization.object({ - "user": serialization.object({ - "profile": serialization.object({ - "name": serialization.string(), - "age": serialization.number().optional() - }) - }), - "tags": serialization.list(serialization.string()), - "metadata": serialization.record(serialization.string(), serialization.any()) -})" -`; - -exports[`ZurgImpl AST Generation Baseline > Enum Schemas > enum with multiple values generates correct AST 1`] = `"serialization.enum_(["ACTIVE", "INACTIVE", "PENDING"])"`; - -exports[`ZurgImpl AST Generation Baseline > Enum Schemas > enum with single value generates correct AST 1`] = `"serialization.enum_(["ACTIVE"])"`; - -exports[`ZurgImpl AST Generation Baseline > Lazy Schemas (for recursion) > lazy() generates correct AST 1`] = `"serialization.lazy(() => serialization.string())"`; - -exports[`ZurgImpl AST Generation Baseline > Lazy Schemas (for recursion) > lazyObject() generates correct AST 1`] = ` -"serialization.lazyObject(() => serialization.object({ - "id": serialization.string() -}))" -`; - -exports[`ZurgImpl AST Generation Baseline > Literal Schemas > booleanLiteral(false) generates correct AST 1`] = `"serialization.booleanLiteral(false)"`; - -exports[`ZurgImpl AST Generation Baseline > Literal Schemas > booleanLiteral(true) generates correct AST 1`] = `"serialization.booleanLiteral(true)"`; - -exports[`ZurgImpl AST Generation Baseline > Literal Schemas > stringLiteral() generates correct AST 1`] = `"serialization.stringLiteral("hello")"`; - -exports[`ZurgImpl AST Generation Baseline > MaybeValid Visitor > _visitMaybeValid generates correct AST 1`] = ` -"{ - if (result.ok) { - console.log(result.value); - } - else { - throw new Error(result.errors); - } -}" -`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > empty object generates correct AST 1`] = `"serialization.object({})"`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with different raw/parsed keys generates correct AST 1`] = ` -"serialization.object({ - "firstName": serialization.property("first_name", serialization.string()), - "lastName": serialization.property("last_name", serialization.string()) -})" -`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with nullable property generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string().nullable() -})" -`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with optional property generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string(), - "nickname": serialization.string().optional() -})" -`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > object with same raw/parsed keys generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string(), - "age": serialization.number() -})" -`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > object.extend() generates correct AST 1`] = ` -"serialization.object({ - "id": serialization.string() -}).extend(serialization.object({ - "name": serialization.string() -}))" -`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > object.passthrough() generates correct AST 1`] = ` -"serialization.object({ - "id": serialization.string() -}).passthrough()" -`; - -exports[`ZurgImpl AST Generation Baseline > Object Schemas > objectWithoutOptionalProperties generates correct AST 1`] = ` -"serialization.objectWithoutOptionalProperties({ - "id": serialization.string() -})" -`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > any() generates correct AST 1`] = `"serialization.any()"`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > bigint() generates correct AST 1`] = `"serialization.bigint()"`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > boolean() generates correct AST 1`] = `"serialization.boolean()"`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > date() generates correct AST 1`] = `"serialization.date()"`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > never() generates correct AST 1`] = `"serialization.never()"`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > number() generates correct AST 1`] = `"serialization.number()"`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > string() generates correct AST 1`] = `"serialization.string()"`; - -exports[`ZurgImpl AST Generation Baseline > Primitive Schemas > unknown() generates correct AST 1`] = `"serialization.unknown()"`; - -exports[`ZurgImpl AST Generation Baseline > Schema Modifiers > nullable() generates correct AST 1`] = `"serialization.string().nullable()"`; - -exports[`ZurgImpl AST Generation Baseline > Schema Modifiers > optional() generates correct AST 1`] = `"serialization.string().optional()"`; - -exports[`ZurgImpl AST Generation Baseline > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"serialization.string().optionalNullable()"`; - -exports[`ZurgImpl AST Generation Baseline > Schema Operations > json() generates correct AST 1`] = `"serialization.string().json(parsedValue)"`; - -exports[`ZurgImpl AST Generation Baseline > Schema Operations > jsonOrThrow() generates correct AST 1`] = `"serialization.string().jsonOrThrow(parsedValue)"`; - -exports[`ZurgImpl AST Generation Baseline > Schema Operations > parse() generates correct AST 1`] = `"serialization.string().parse(rawValue)"`; - -exports[`ZurgImpl AST Generation Baseline > Schema Operations > parse() with skipValidation generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string() -}).parse(rawValue, { unrecognizedObjectKeys: "passthrough", allowUnrecognizedUnionMembers: true, allowUnrecognizedEnumValues: true, skipValidation: true, omitUndefined: true, breadcrumbsPrefix: ["request"] })" -`; - -exports[`ZurgImpl AST Generation Baseline > Schema Operations > parseOrThrow() generates correct AST 1`] = `"serialization.string().parseOrThrow(rawValue)"`; - -exports[`ZurgImpl AST Generation Baseline > Type References > ObjectSchema._getReferenceToType generates correct AST 1`] = `"serialization.ObjectSchema<{}, {}>"`; - -exports[`ZurgImpl AST Generation Baseline > Type References > Schema._getReferenceToType generates correct AST 1`] = ` -"serialization.Schema<{ - name: string; -}, { - name: string; -}>" -`; - -exports[`ZurgImpl AST Generation Baseline > Union Schemas > discriminated union generates correct AST 1`] = ` -"serialization.union("type", { - "dog": serialization.object({ - "breed": serialization.string() - }), - "cat": serialization.object({ - "indoor": serialization.boolean() - }) -})" -`; - -exports[`ZurgImpl AST Generation Baseline > Union Schemas > undiscriminatedUnion generates correct AST 1`] = `"serialization.undiscriminatedUnion([serialization.string(), serialization.number(), serialization.boolean()])"`; - -exports[`ZurgImpl AST Generation Baseline > Union Schemas > union with different raw/parsed discriminant generates correct AST 1`] = ` -"serialization.union(serialization.discriminant("animalType", "animal_type"), { - "dog": serialization.object({}) -})" -`; From c6e145dd737a333fadd8885249f4d1fe80a40206 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 23:41:38 -0500 Subject: [PATCH 20/71] config --- generators/typescript/utils/commons/vitest.config.ts | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 generators/typescript/utils/commons/vitest.config.ts diff --git a/generators/typescript/utils/commons/vitest.config.ts b/generators/typescript/utils/commons/vitest.config.ts new file mode 100644 index 000000000000..cac7ed537897 --- /dev/null +++ b/generators/typescript/utils/commons/vitest.config.ts @@ -0,0 +1,2 @@ +export { default } from "../../../../shared/vitest.config"; + From 9ac3737fb009f0fb36642b5f77848a21d490d4ff Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Thu, 4 Dec 2025 23:45:31 -0500 Subject: [PATCH 21/71] exported shared config --- generators/typescript/utils/commons/vitest.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/generators/typescript/utils/commons/vitest.config.ts b/generators/typescript/utils/commons/vitest.config.ts index cac7ed537897..d11017dc6763 100644 --- a/generators/typescript/utils/commons/vitest.config.ts +++ b/generators/typescript/utils/commons/vitest.config.ts @@ -1,2 +1 @@ export { default } from "../../../../shared/vitest.config"; - From 0af9c0229cbc05e5b7519cd75008c89b54e86ef1 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 10:04:27 -0500 Subject: [PATCH 22/71] added comments --- .../src/serialization-pipeline/SerializationPipeline.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index 1dda37b65761..75ca2e4a9b63 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -12,11 +12,12 @@ export type SerializationFormatType = "default" | "zod" | "none"; * Configuration for creating a SerializationPipeline */ export interface SerializationPipelineConfig extends SerializationFormatConfig { + /** * The serialization format to use. - * - "default": Use Zurg (bundled runtime) - * - "zod": Use Zod (npm dependency) - * - "none": No serialization + * - "default": Use Zurg (legacy implementation) + * - "zod": Use Zod. + * - "none": No serialization, equivalent to noSerdeLayer: true. */ format: SerializationFormatType; } From 3ecd521553d2d8ebb43d7881c71775d182b9bb53 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 10:33:38 -0500 Subject: [PATCH 23/71] remove vertical space --- .../commons/src/serialization-pipeline/SerializationPipeline.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index 75ca2e4a9b63..a8d85417dd28 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -12,7 +12,6 @@ export type SerializationFormatType = "default" | "zod" | "none"; * Configuration for creating a SerializationPipeline */ export interface SerializationPipelineConfig extends SerializationFormatConfig { - /** * The serialization format to use. * - "default": Use Zurg (legacy implementation) From 20e2350632d176fdf153b79395802ba576d94339 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 11:50:07 -0500 Subject: [PATCH 24/71] removed erroneous todo --- .../ast/src/custom-config/TypescriptCustomConfigSchema.ts | 1 + generators/typescript/sdk/cli/src/SdkGeneratorCli.ts | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts b/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts index d4c3cd0fa394..9d93c777bf7b 100644 --- a/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts +++ b/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts @@ -51,6 +51,7 @@ export const TypescriptCustomConfigSchema = z.strictObject({ inlinePathParameters: z.optional(z.boolean()), namespaceExport: z.optional(z.string()), noSerdeLayer: z.optional(z.boolean()), + serializationFormat: z.optional(z.enum(["default", "zod", "none"])), private: z.optional(z.boolean()), requireDefaultEnvironment: z.optional(z.boolean()), retainOriginalCasing: z.optional(z.boolean()), diff --git a/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts b/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts index 618c7059418e..83c04a896fdb 100644 --- a/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts +++ b/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts @@ -40,12 +40,8 @@ export class SdkGeneratorCli extends AbstractGeneratorCli { // Resolve serialization format from new option or legacy noSerdeLayer // Note: SDK defaults to noSerdeLayer: true (no serialization) for backward compatibility - // TODO: Add serializationFormat to TypescriptCustomConfigSchema in @fern-api/typescript-ast - const parsedWithFormat = parsed as - | (typeof parsed & { serializationFormat?: SerializationFormatType }) - | undefined; const serializationFormat = SerializationPipeline.resolveFormatType({ - serializationFormat: parsedWithFormat?.serializationFormat, + serializationFormat: parsed?.serializationFormat, noSerdeLayer: parsed?.noSerdeLayer ?? true }); const noSerdeLayer = serializationFormat === "none"; From 08106d08398c9faf5ca4e4e540703ba85768a38b Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 11:50:39 -0500 Subject: [PATCH 25/71] removed unused import --- generators/typescript/sdk/cli/src/SdkGeneratorCli.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts b/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts index 83c04a896fdb..019435ecc3e2 100644 --- a/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts +++ b/generators/typescript/sdk/cli/src/SdkGeneratorCli.ts @@ -9,7 +9,6 @@ import { fixImportsForEsm, NpmPackage, PersistedTypescriptProject, - SerializationFormatType, SerializationPipeline, writeTemplateFiles } from "@fern-typescript/commons"; From 7ea1bb201ebe729389d9afc3f94fbc3e07aba499 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 12:00:15 -0500 Subject: [PATCH 26/71] changed default back to zurg --- .../TypescriptCustomConfigSchema.ts | 2 +- .../express/generator/src/ExpressGenerator.ts | 2 +- .../sdk/generator/src/SdkGenerator.ts | 2 +- .../SerializationFormat.ts | 2 +- .../SerializationPipeline.ts | 12 +++++----- .../__tests__/SerializationPipeline.test.ts | 22 +++++++++---------- .../__tests__/ZurgFormat.test.ts | 2 +- .../formats/ZurgFormat.ts | 2 +- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts b/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts index 9d93c777bf7b..9a9d9921b8ee 100644 --- a/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts +++ b/generators/typescript-v2/ast/src/custom-config/TypescriptCustomConfigSchema.ts @@ -51,7 +51,7 @@ export const TypescriptCustomConfigSchema = z.strictObject({ inlinePathParameters: z.optional(z.boolean()), namespaceExport: z.optional(z.string()), noSerdeLayer: z.optional(z.boolean()), - serializationFormat: z.optional(z.enum(["default", "zod", "none"])), + serializationFormat: z.optional(z.enum(["zurg", "zod", "none"])), private: z.optional(z.boolean()), requireDefaultEnvironment: z.optional(z.boolean()), retainOriginalCasing: z.optional(z.boolean()), diff --git a/generators/typescript/express/generator/src/ExpressGenerator.ts b/generators/typescript/express/generator/src/ExpressGenerator.ts index f8574e8b04d7..f5f3203e4e12 100644 --- a/generators/typescript/express/generator/src/ExpressGenerator.ts +++ b/generators/typescript/express/generator/src/ExpressGenerator.ts @@ -59,7 +59,7 @@ export declare namespace ExpressGenerator { includeOtherInUnionTypes: boolean; treatUnknownAsAny: boolean; includeSerdeLayer: boolean; - serializationFormat: "default" | "zod" | "none"; + serializationFormat: "zurg" | "zod" | "none"; outputEsm: boolean; retainOriginalCasing: boolean; allowExtraFields: boolean; diff --git a/generators/typescript/sdk/generator/src/SdkGenerator.ts b/generators/typescript/sdk/generator/src/SdkGenerator.ts index 729691c81727..7fbde16239bb 100644 --- a/generators/typescript/sdk/generator/src/SdkGenerator.ts +++ b/generators/typescript/sdk/generator/src/SdkGenerator.ts @@ -124,7 +124,7 @@ export declare namespace SdkGenerator { treatUnknownAsAny: boolean; includeContentHeadersOnFileDownloadResponse: boolean; includeSerdeLayer: boolean; - serializationFormat: "default" | "zod" | "none"; + serializationFormat: "zurg" | "zod" | "none"; noOptionalProperties: boolean; tolerateRepublish: boolean; retainOriginalCasing: boolean; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts index e7eb420ebc5b..cce51396e972 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts @@ -168,7 +168,7 @@ export interface SerializationFormat { /** * Unique identifier for this format */ - readonly name: "default" | "zod" | "none"; + readonly name: "zurg" | "zod" | "none"; // ==================== Schema Builders ==================== diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index a8d85417dd28..5f5d31a528c1 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -6,7 +6,7 @@ import { SerializationFormat, SerializationFormatConfig } from "./SerializationF /** * Supported serialization format types */ -export type SerializationFormatType = "default" | "zod" | "none"; +export type SerializationFormatType = "zurg" | "zod" | "none"; /** * Configuration for creating a SerializationPipeline @@ -14,9 +14,9 @@ export type SerializationFormatType = "default" | "zod" | "none"; export interface SerializationPipelineConfig extends SerializationFormatConfig { /** * The serialization format to use. - * - "default": Use Zurg (legacy implementation) - * - "zod": Use Zod. - * - "none": No serialization, equivalent to noSerdeLayer: true. + * - "zurg": Use Zurg (bundled runtime) + * - "zod": Use Zod (npm dependency) + * - "none": No serialization */ format: SerializationFormatType; } @@ -40,7 +40,7 @@ export class SerializationPipeline { */ private createFormat(config: SerializationPipelineConfig): SerializationFormat { switch (config.format) { - case "default": + case "zurg": return new ZurgFormat(config); case "zod": @@ -108,6 +108,6 @@ export class SerializationPipeline { } // Default to Zurg - return "default"; + return "zurg"; } } diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts index 096bd8a1448f..d10d4f1568d7 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts @@ -47,11 +47,11 @@ describe("SerializationPipeline", () => { it("creates ZurgFormat for 'default'", () => { const pipeline = new SerializationPipeline({ ...baseConfig, - format: "default" + format: "zurg" }); expect(pipeline.getFormat()).toBeInstanceOf(ZurgFormat); - expect(pipeline.getFormatType()).toBe("default"); + expect(pipeline.getFormatType()).toBe("zurg"); expect(pipeline.isEnabled()).toBe(true); }); @@ -82,9 +82,9 @@ describe("SerializationPipeline", () => { it("returns explicit serializationFormat when provided", () => { expect( SerializationPipeline.resolveFormatType({ - serializationFormat: "default" + serializationFormat: "zurg" }) - ).toBe("default"); + ).toBe("zurg"); expect( SerializationPipeline.resolveFormatType({ @@ -112,21 +112,21 @@ describe("SerializationPipeline", () => { SerializationPipeline.resolveFormatType({ noSerdeLayer: false }) - ).toBe("default"); + ).toBe("zurg"); }); it("returns 'default' when nothing is specified", () => { - expect(SerializationPipeline.resolveFormatType({})).toBe("default"); + expect(SerializationPipeline.resolveFormatType({})).toBe("zurg"); }); it("serializationFormat takes precedence over noSerdeLayer", () => { // Even with noSerdeLayer: true, explicit format wins expect( SerializationPipeline.resolveFormatType({ - serializationFormat: "default", + serializationFormat: "zurg", noSerdeLayer: true }) - ).toBe("default"); + ).toBe("zurg"); // And vice versa expect( @@ -142,7 +142,7 @@ describe("SerializationPipeline", () => { it("ZurgFormat returns no npm dependencies", () => { const pipeline = new SerializationPipeline({ ...baseConfig, - format: "default" + format: "zurg" }); expect(pipeline.getRuntimeDependencies()).toEqual({}); @@ -151,7 +151,7 @@ describe("SerializationPipeline", () => { it("ZurgFormat returns file patterns for bundled runtime", () => { const pipeline = new SerializationPipeline({ ...baseConfig, - format: "default" + format: "zurg" }); const patterns = pipeline.getRuntimeFilePatterns(); @@ -185,7 +185,7 @@ describe("SerializationPipeline", () => { it("ZurgFormat generates valid schema expressions", () => { const pipeline = new SerializationPipeline({ ...baseConfig, - format: "default" + format: "zurg" }); const format = pipeline.getFormat(); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts index 03d453808733..19fecf3e45eb 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts @@ -249,7 +249,7 @@ describe("ZurgFormat AST Generation", () => { describe("Format Identity", () => { it("has name 'default'", () => { - expect(zurg.name).toBe("default"); + expect(zurg.name).toBe("zurg"); }); }); }); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index a5b637962c99..3b8013cbeb75 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -40,7 +40,7 @@ interface ZurgBaseSchema extends Schema { * This generates TypeScript AST that uses Zurg's runtime schema library. */ export class ZurgFormat implements SerializationFormat { - public readonly name = "default" as const; + public readonly name = "zurg" as const; private getReferenceToExport: (args: { manifest: CoreUtility.Manifest; exportedName: string }) => Reference; private generateEndpointMetadata: boolean; From 4b87b52e0e5600c3f796626a7c7ced48d3f529c5 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 12:16:59 -0500 Subject: [PATCH 27/71] fixed remaining default values --- .../cli/src/custom-config/schema/ExpressCustomConfigSchema.ts | 2 +- .../utils/commons/src/core-utilities/CoreUtilitiesManager.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts b/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts index d5e678c86c4a..ee60a5662132 100644 --- a/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts +++ b/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts @@ -6,7 +6,7 @@ import { z } from "zod"; * - "zod": Use Zod as npm dependency * - "none": No serialization layer - same as noSerdeLayer: true */ -const SerializationFormatSchema = z.enum(["default", "zod", "none"]); +const SerializationFormatSchema = z.enum(["zurg", "zod", "none"]); export const ExpressCustomConfigSchema = z.strictObject({ useBrandedStringAliases: z.optional(z.boolean()), diff --git a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts index 27eb6676e699..353403ab3afe 100644 --- a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts +++ b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts @@ -67,7 +67,7 @@ export class CoreUtilitiesManager { relativePackagePath = DEFAULT_PACKAGE_PATH, relativeTestPath = DEFAULT_TEST_PATH, generateEndpointMetadata, - serializationFormat = "default" + serializationFormat = "zurg" }: { streamType: "wrapper" | "web"; formDataSupport: "Node16" | "Node18"; @@ -154,7 +154,7 @@ export class CoreUtilitiesManager { }; switch (this.serializationFormat) { - case "default": + case "zurg": // Add Zurg manifest to referenced utilities so it gets copied this.addManifestAndDependencies(ZURG_MANIFEST); return new ZurgFormat(config); From 8fc0d49fe40ba9b40ee710c26af697d870c34a90 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 13:04:23 -0500 Subject: [PATCH 28/71] renamed none to passthrough --- .../src/core-utilities/CoreUtilitiesManager.ts | 6 +++--- .../serialization-pipeline/SerializationPipeline.ts | 6 +++--- .../__tests__/SerializationPipeline.test.ts | 12 ++++++------ .../formats/{NoneFormat.ts => PassthroughFormat.ts} | 8 +++++--- .../src/serialization-pipeline/formats/index.ts | 2 +- .../commons/src/serialization-pipeline/index.ts | 2 +- 6 files changed, 19 insertions(+), 17 deletions(-) rename generators/typescript/utils/commons/src/serialization-pipeline/formats/{NoneFormat.ts => PassthroughFormat.ts} (94%) diff --git a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts index 353403ab3afe..b643b7f44e26 100644 --- a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts +++ b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts @@ -9,7 +9,7 @@ import { ExportsManager } from "../exports-manager"; import { ImportsManager } from "../imports-manager"; import { getReferenceToExportViaNamespaceImport } from "../referencing"; import { - NoneFormat, + PassthroughFormat, SerializationFormatType, SerializationPipeline, ZodFormat, @@ -163,7 +163,7 @@ export class CoreUtilitiesManager { return new ZodFormat(config); case "none": - return new NoneFormat(config); + return new PassthroughFormat(config); default: throw new Error(`Unknown serialization format: ${this.serializationFormat}`); @@ -200,7 +200,7 @@ export class CoreUtilitiesManager { // Zod uses an npm dependency instead of bundled runtime files dependencyManager.addDependency("zod", "^3.23.0"); } - // Zurg and None formats don't require external npm dependencies + // Zurg and Passthrough formats don't require external npm dependencies } public async copyCoreUtilities({ diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index 5f5d31a528c1..660148e8af7f 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -1,4 +1,4 @@ -import { NoneFormat } from "./formats/NoneFormat"; +import { PassthroughFormat } from "./formats/PassthroughFormat"; import { ZodFormat } from "./formats/ZodFormat"; import { ZurgFormat } from "./formats/ZurgFormat"; import { SerializationFormat, SerializationFormatConfig } from "./SerializationFormat"; @@ -16,7 +16,7 @@ export interface SerializationPipelineConfig extends SerializationFormatConfig { * The serialization format to use. * - "zurg": Use Zurg (bundled runtime) * - "zod": Use Zod (npm dependency) - * - "none": No serialization + * - "none": No serialization, data passes through unchanged */ format: SerializationFormatType; } @@ -47,7 +47,7 @@ export class SerializationPipeline { return new ZodFormat(config); case "none": - return new NoneFormat(config); + return new PassthroughFormat(config); default: throw new Error(`Unknown serialization format: ${config.format}`); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts index d10d4f1568d7..7281a23bd309 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/SerializationPipeline.test.ts @@ -2,7 +2,7 @@ import { ts } from "ts-morph"; import { describe, expect, it } from "vitest"; import { Reference } from "../../referencing"; -import { NoneFormat } from "../formats/NoneFormat"; +import { PassthroughFormat } from "../formats/PassthroughFormat"; import { ZodFormat } from "../formats/ZodFormat"; import { ZurgFormat } from "../formats/ZurgFormat"; import { SerializationPipeline } from "../SerializationPipeline"; @@ -55,13 +55,13 @@ describe("SerializationPipeline", () => { expect(pipeline.isEnabled()).toBe(true); }); - it("creates NoneFormat for 'none'", () => { + it("creates PassthroughFormat for 'none'", () => { const pipeline = new SerializationPipeline({ ...baseConfig, format: "none" }); - expect(pipeline.getFormat()).toBeInstanceOf(NoneFormat); + expect(pipeline.getFormat()).toBeInstanceOf(PassthroughFormat); expect(pipeline.getFormatType()).toBe("none"); expect(pipeline.isEnabled()).toBe(false); }); @@ -159,7 +159,7 @@ describe("SerializationPipeline", () => { expect(patterns?.patterns).toContain("src/core/schemas/**"); }); - it("NoneFormat returns no dependencies and no files", () => { + it("PassthroughFormat returns no dependencies and no files", () => { const pipeline = new SerializationPipeline({ ...baseConfig, format: "none" @@ -198,7 +198,7 @@ describe("SerializationPipeline", () => { expect(ts.isCallExpression(expr)).toBe(true); }); - it("NoneFormat generates no-op expressions", () => { + it("PassthroughFormat generates no-op expressions", () => { const pipeline = new SerializationPipeline({ ...baseConfig, format: "none" @@ -209,7 +209,7 @@ describe("SerializationPipeline", () => { const expr = schema.toExpression(); expect(expr).toBeDefined(); - // NoneFormat returns identifier "undefined" + // PassthroughFormat returns identifier "undefined" expect(ts.isIdentifier(expr)).toBe(true); }); }); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts similarity index 94% rename from generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts rename to generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts index 35fdc5b805ee..ba3aa338c19d 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/NoneFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts @@ -41,14 +41,15 @@ const NO_OP_OBJECT_SCHEMA: ObjectSchema = { }; /** - * NoneFormat - used when serialization is completely disabled. + * PassthroughFormat - used when serialization is completely disabled. * All schema builders return no-op schemas that don't generate any code. + * Data passes through without transformation. */ -export class NoneFormat implements SerializationFormat { +export class PassthroughFormat implements SerializationFormat { public readonly name = "none" as const; constructor(_config: SerializationFormatConfig) { - // No configuration needed for none format + // No configuration needed for passthrough format } // All schema builders return no-op schemas @@ -120,3 +121,4 @@ export class NoneFormat implements SerializationFormat { return null; // No runtime files needed } } + diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts index c0820b23adf7..9483f130b18c 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts @@ -1,3 +1,3 @@ -export { NoneFormat } from "./NoneFormat"; +export { PassthroughFormat } from "./PassthroughFormat"; export { ZodFormat } from "./ZodFormat"; export { ZURG_MANIFEST, ZurgFormat } from "./ZurgFormat"; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts index 3a7bbe8c8f0a..0f264ee98701 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/index.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts @@ -1,4 +1,4 @@ -export { NoneFormat, ZodFormat, ZURG_MANIFEST, ZurgFormat } from "./formats"; +export { PassthroughFormat, ZodFormat, ZURG_MANIFEST, ZurgFormat } from "./formats"; export { type AdditionalProperty, type ObjectLikeSchema, From e483e1dcd8ce5dbb1da09f26d8019ad8a714417c Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 13:04:30 -0500 Subject: [PATCH 29/71] added to seed yaml --- seed/ts-sdk/seed.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/seed/ts-sdk/seed.yml b/seed/ts-sdk/seed.yml index 76092f648563..490bf422e665 100644 --- a/seed/ts-sdk/seed.yml +++ b/seed/ts-sdk/seed.yml @@ -78,6 +78,15 @@ fixtures: - outputFolder: serde-layer customConfig: noSerdeLayer: false + - outputFolder: serde-layer-zurg + customConfig: + serializationFormat: zurg + - outputFolder: serde-layer-zod + customConfig: + serializationFormat: zod + - outputFolder: serde-layer-none + customConfig: + serializationFormat: none - outputFolder: retain-original-casing customConfig: retainOriginalCasing: true From 1640453ef20531c93b1879693a805897510ab3a3 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 14:10:18 -0500 Subject: [PATCH 30/71] test generation --- .../serde-layer-none/.fern/metadata.json | 8 + .../serde-layer-none/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-none/.gitignore | 3 + .../serde-layer-none/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-none/README.md | 241 ++ .../exhaustive/serde-layer-none/biome.json | 74 + .../exhaustive/serde-layer-none/package.json | 66 + .../serde-layer-none/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-none/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-none/snippet.json | 544 ++++ .../serde-layer-none/src/BaseClient.ts | 82 + .../exhaustive/serde-layer-none/src/Client.ts | 48 + .../serde-layer-none/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 458 +++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 171 + .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 80 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 334 ++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 522 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 522 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 535 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 80 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 84 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 210 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 110 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 89 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 126 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 93 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 35 + .../serde-layer-none/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-none/src/core/auth/index.ts | 5 + .../serde-layer-none/src/core/base64.ts | 27 + .../serde-layer-none/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-none/src/core/headers.ts | 35 + .../serde-layer-none/src/core/index.ts | 6 + .../serde-layer-none/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-none/src/core/url/index.ts | 3 + .../serde-layer-none/src/core/url/join.ts | 79 + .../serde-layer-none/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-none/src/errors/index.ts | 2 + .../serde-layer-none/src/exports.ts | 1 + .../exhaustive/serde-layer-none/src/index.ts | 5 + .../serde-layer-none/src/version.ts | 1 + .../serde-layer-none/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../serde-layer-none/tests/setup.ts | 80 + .../serde-layer-none/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/url/join.test.ts | 284 ++ .../tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-none/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-none/tsconfig.base.json | 18 + .../serde-layer-none/tsconfig.cjs.json | 9 + .../serde-layer-none/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-none/tsconfig.json | 3 + .../serde-layer-none/vitest.config.mts | 28 + .../serde-layer-zod/.fern/metadata.json | 8 + .../serde-layer-zod/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-zod/.gitignore | 3 + .../serde-layer-zod/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-zod/README.md | 241 ++ .../exhaustive/serde-layer-zod/biome.json | 74 + .../exhaustive/serde-layer-zod/package.json | 80 + .../serde-layer-zod/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-zod/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-zod/snippet.json | 544 ++++ .../serde-layer-zod/src/BaseClient.ts | 82 + .../exhaustive/serde-layer-zod/src/Client.ts | 48 + .../serde-layer-zod/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 468 +++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 171 + .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 81 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 341 ++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 523 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 535 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 563 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 84 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 85 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 223 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 111 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 93 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 130 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 89 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 35 + .../serde-layer-zod/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-zod/src/core/auth/index.ts | 5 + .../serde-layer-zod/src/core/base64.ts | 27 + .../serde-layer-zod/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../serde-layer-zod/src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-zod/src/core/headers.ts | 35 + .../serde-layer-zod/src/core/index.ts | 6 + .../serde-layer-zod/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../serde-layer-zod/src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../serde-layer-zod/src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-zod/src/core/url/index.ts | 3 + .../serde-layer-zod/src/core/url/join.ts | 79 + .../serde-layer-zod/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-zod/src/errors/index.ts | 2 + .../exhaustive/serde-layer-zod/src/exports.ts | 1 + .../exhaustive/serde-layer-zod/src/index.ts | 6 + .../src/serialization/index.ts | 1 + .../resources/endpoints/index.ts | 1 + .../client/getAndReturnListOfObjects.ts | 25 + .../client/getAndReturnListOfPrimitives.ts | 23 + .../client/getAndReturnMapOfPrimToObject.ts | 25 + .../client/getAndReturnMapPrimToPrim.ts | 23 + .../container/client/getAndReturnOptional.ts | 25 + .../client/getAndReturnSetOfObjects.ts | 25 + .../client/getAndReturnSetOfPrimitives.ts | 23 + .../resources/container/client/index.ts | 7 + .../endpoints/resources/container/index.ts | 1 + .../resources/httpMethods/client/index.ts | 2 + .../httpMethods/client/testDelete.ts | 9 + .../resources/httpMethods/client/testGet.ts | 9 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 8 + ...tAndReturnNestedWithRequiredFieldAsList.ts | 15 + .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../params/client/getWithInlinePath.ts | 9 + .../resources/params/client/getWithPath.ts | 9 + .../resources/params/client/index.ts | 4 + .../params/client/modifyWithInlinePath.ts | 17 + .../resources/params/client/modifyWithPath.ts | 15 + .../endpoints/resources/params/index.ts | 1 + .../primitive/client/getAndReturnBase64.ts | 17 + .../primitive/client/getAndReturnBool.ts | 17 + .../primitive/client/getAndReturnDate.ts | 16 + .../primitive/client/getAndReturnDatetime.ts | 19 + .../primitive/client/getAndReturnDouble.ts | 17 + .../primitive/client/getAndReturnInt.ts | 16 + .../primitive/client/getAndReturnLong.ts | 16 + .../primitive/client/getAndReturnString.ts | 17 + .../primitive/client/getAndReturnUuid.ts | 16 + .../resources/primitive/client/index.ts | 9 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/index.ts | 1 + .../resources/put/types/ErrorCategory.ts | 14 + .../resources/put/types/ErrorCode.ts | 34 + .../endpoints/resources/put/types/Error_.ts | 23 + .../resources/put/types/PutResponse.ts | 21 + .../endpoints/resources/put/types/index.ts | 4 + .../endpoints/resources/urls/client/index.ts | 4 + .../resources/urls/client/noEndingSlash.ts | 9 + .../resources/urls/client/withEndingSlash.ts | 9 + .../resources/urls/client/withMixedCase.ts | 9 + .../resources/urls/client/withUnderscores.ts | 9 + .../endpoints/resources/urls/index.ts | 1 + .../resources/generalErrors/index.ts | 1 + .../types/BadObjectRequestInfo.ts | 20 + .../resources/generalErrors/types/index.ts | 1 + .../src/serialization/resources/index.ts | 9 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 26 + .../inlinedRequests/client/requests/index.ts | 1 + .../resources/inlinedRequests/index.ts | 1 + .../resources/noAuth/client/index.ts | 1 + .../resources/noAuth/client/postWithNoAuth.ts | 9 + .../serialization/resources/noAuth/index.ts | 1 + .../resources/noReqBody/client/index.ts | 1 + .../noReqBody/client/postWithNoRequestBody.ts | 9 + .../resources/noReqBody/index.ts | 1 + .../client/getWithCustomHeader.ts | 9 + .../resources/reqWithHeaders/client/index.ts | 1 + .../resources/reqWithHeaders/index.ts | 1 + .../serialization/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 20 + .../types/resources/docs/types/index.ts | 1 + .../resources/types/resources/enum/index.ts | 1 + .../resources/enum/types/WeatherReport.ts | 11 + .../types/resources/enum/types/index.ts | 1 + .../resources/types/resources/index.ts | 8 + .../resources/types/resources/object/index.ts | 1 + .../resources/object/types/DoubleOptional.ts | 21 + .../types/NestedObjectWithOptionalField.ts | 28 + .../types/NestedObjectWithRequiredField.ts | 28 + .../object/types/ObjectWithMapOfMap.ts | 20 + .../object/types/ObjectWithOptionalField.ts | 47 + .../object/types/ObjectWithRequiredField.ts | 20 + .../resources/object/types/OptionalAlias.ts | 12 + .../types/resources/object/types/index.ts | 7 + .../resources/types/resources/union/index.ts | 1 + .../types/resources/union/types/Animal.ts | 25 + .../types/resources/union/types/Cat.ts | 16 + .../types/resources/union/types/Dog.ts | 16 + .../types/resources/union/types/index.ts | 3 + .../exhaustive/serde-layer-zod/src/version.ts | 1 + .../serde-layer-zod/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../exhaustive/serde-layer-zod/tests/setup.ts | 80 + .../serde-layer-zod/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../serde-layer-zod/tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/url/join.test.ts | 284 ++ .../serde-layer-zod/tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-zod/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../serde-layer-zod/tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-zod/tsconfig.base.json | 18 + .../serde-layer-zod/tsconfig.cjs.json | 9 + .../serde-layer-zod/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-zod/tsconfig.json | 3 + .../serde-layer-zod/vitest.config.mts | 28 + .../serde-layer-zurg/.fern/metadata.json | 8 + .../serde-layer-zurg/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-zurg/.gitignore | 3 + .../serde-layer-zurg/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-zurg/README.md | 241 ++ .../exhaustive/serde-layer-zurg/biome.json | 74 + .../exhaustive/serde-layer-zurg/package.json | 78 + .../serde-layer-zurg/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-zurg/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-zurg/snippet.json | 544 ++++ .../serde-layer-zurg/src/BaseClient.ts | 82 + .../exhaustive/serde-layer-zurg/src/Client.ts | 48 + .../serde-layer-zurg/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 543 ++++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 178 ++ .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 93 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 380 +++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 577 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 565 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 644 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 90 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 97 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 247 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 126 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 105 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 142 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 93 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 35 + .../serde-layer-zurg/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-zurg/src/core/auth/index.ts | 5 + .../serde-layer-zurg/src/core/base64.ts | 27 + .../serde-layer-zurg/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-zurg/src/core/headers.ts | 35 + .../serde-layer-zurg/src/core/index.ts | 7 + .../serde-layer-zurg/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/schemas/Schema.ts | 103 + .../core/schemas/builders/bigint/bigint.ts | 55 + .../src/core/schemas/builders/bigint/index.ts | 1 + .../src/core/schemas/builders/date/date.ts | 65 + .../src/core/schemas/builders/date/index.ts | 1 + .../src/core/schemas/builders/enum/enum.ts | 43 + .../src/core/schemas/builders/enum/index.ts | 1 + .../src/core/schemas/builders/index.ts | 14 + .../src/core/schemas/builders/lazy/index.ts | 3 + .../src/core/schemas/builders/lazy/lazy.ts | 32 + .../core/schemas/builders/lazy/lazyObject.ts | 20 + .../src/core/schemas/builders/list/index.ts | 1 + .../src/core/schemas/builders/list/list.ts | 73 + .../builders/literals/booleanLiteral.ts | 29 + .../core/schemas/builders/literals/index.ts | 2 + .../builders/literals/stringLiteral.ts | 29 + .../object-like/getObjectLikeUtils.ts | 79 + .../schemas/builders/object-like/index.ts | 2 + .../schemas/builders/object-like/types.ts | 13 + .../src/core/schemas/builders/object/index.ts | 22 + .../core/schemas/builders/object/object.ts | 382 +++ .../object/objectWithoutOptionalProperties.ts | 23 + .../core/schemas/builders/object/property.ts | 23 + .../src/core/schemas/builders/object/types.ts | 73 + .../core/schemas/builders/primitives/any.ts | 7 + .../schemas/builders/primitives/boolean.ts | 25 + .../core/schemas/builders/primitives/index.ts | 6 + .../core/schemas/builders/primitives/never.ts | 15 + .../schemas/builders/primitives/number.ts | 25 + .../schemas/builders/primitives/string.ts | 25 + .../schemas/builders/primitives/unknown.ts | 7 + .../src/core/schemas/builders/record/index.ts | 2 + .../core/schemas/builders/record/record.ts | 129 + .../src/core/schemas/builders/record/types.ts | 17 + .../builders/schema-utils/JsonError.ts | 9 + .../builders/schema-utils/ParseError.ts | 9 + .../builders/schema-utils/getSchemaUtils.ts | 181 ++ .../schemas/builders/schema-utils/index.ts | 4 + .../schema-utils/stringifyValidationErrors.ts | 8 + .../src/core/schemas/builders/set/index.ts | 1 + .../src/core/schemas/builders/set/set.ts | 43 + .../builders/undiscriminated-union/index.ts | 6 + .../builders/undiscriminated-union/types.ts | 10 + .../undiscriminatedUnion.ts | 67 + .../schemas/builders/union/discriminant.ts | 14 + .../src/core/schemas/builders/union/index.ts | 10 + .../src/core/schemas/builders/union/types.ts | 26 + .../src/core/schemas/builders/union/union.ts | 176 ++ .../src/core/schemas/index.ts | 2 + .../src/core/schemas/utils/MaybePromise.ts | 1 + .../addQuestionMarksToNullableProperties.ts | 9 + .../utils/createIdentitySchemaCreator.ts | 21 + .../src/core/schemas/utils/entries.ts | 3 + .../src/core/schemas/utils/filterObject.ts | 13 + .../utils/getErrorMessageForIncorrectType.ts | 25 + .../src/core/schemas/utils/isPlainObject.ts | 17 + .../src/core/schemas/utils/keys.ts | 3 + .../core/schemas/utils/maybeSkipValidation.ts | 38 + .../src/core/schemas/utils/partition.ts | 12 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-zurg/src/core/url/index.ts | 3 + .../serde-layer-zurg/src/core/url/join.ts | 79 + .../serde-layer-zurg/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-zurg/src/errors/index.ts | 2 + .../serde-layer-zurg/src/exports.ts | 1 + .../exhaustive/serde-layer-zurg/src/index.ts | 6 + .../src/serialization/index.ts | 1 + .../resources/endpoints/index.ts | 1 + .../client/getAndReturnListOfObjects.ts | 24 + .../client/getAndReturnListOfPrimitives.ts | 22 + .../client/getAndReturnMapOfPrimToObject.ts | 24 + .../client/getAndReturnMapPrimToPrim.ts | 22 + .../container/client/getAndReturnOptional.ts | 24 + .../client/getAndReturnSetOfObjects.ts | 24 + .../client/getAndReturnSetOfPrimitives.ts | 22 + .../resources/container/client/index.ts | 7 + .../endpoints/resources/container/index.ts | 1 + .../resources/httpMethods/client/index.ts | 2 + .../httpMethods/client/testDelete.ts | 11 + .../resources/httpMethods/client/testGet.ts | 11 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 8 + ...tAndReturnNestedWithRequiredFieldAsList.ts | 15 + .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../params/client/getWithInlinePath.ts | 11 + .../resources/params/client/getWithPath.ts | 11 + .../resources/params/client/index.ts | 4 + .../params/client/modifyWithInlinePath.ts | 20 + .../resources/params/client/modifyWithPath.ts | 18 + .../endpoints/resources/params/index.ts | 1 + .../primitive/client/getAndReturnBase64.ts | 22 + .../primitive/client/getAndReturnBool.ts | 20 + .../primitive/client/getAndReturnDate.ts | 20 + .../primitive/client/getAndReturnDatetime.ts | 22 + .../primitive/client/getAndReturnDouble.ts | 22 + .../primitive/client/getAndReturnInt.ts | 18 + .../primitive/client/getAndReturnLong.ts | 20 + .../primitive/client/getAndReturnString.ts | 22 + .../primitive/client/getAndReturnUuid.ts | 20 + .../resources/primitive/client/index.ts | 9 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/index.ts | 1 + .../resources/put/types/ErrorCategory.ts | 14 + .../resources/put/types/ErrorCode.ts | 37 + .../endpoints/resources/put/types/Error_.ts | 26 + .../resources/put/types/PutResponse.ts | 19 + .../endpoints/resources/put/types/index.ts | 4 + .../endpoints/resources/urls/client/index.ts | 4 + .../resources/urls/client/noEndingSlash.ts | 11 + .../resources/urls/client/withEndingSlash.ts | 11 + .../resources/urls/client/withMixedCase.ts | 11 + .../resources/urls/client/withUnderscores.ts | 11 + .../endpoints/resources/urls/index.ts | 1 + .../resources/generalErrors/index.ts | 1 + .../types/BadObjectRequestInfo.ts | 18 + .../resources/generalErrors/types/index.ts | 1 + .../src/serialization/resources/index.ts | 9 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 23 + .../inlinedRequests/client/requests/index.ts | 1 + .../resources/inlinedRequests/index.ts | 1 + .../resources/noAuth/client/index.ts | 1 + .../resources/noAuth/client/postWithNoAuth.ts | 11 + .../serialization/resources/noAuth/index.ts | 1 + .../resources/noReqBody/client/index.ts | 1 + .../noReqBody/client/postWithNoRequestBody.ts | 11 + .../resources/noReqBody/index.ts | 1 + .../client/getWithCustomHeader.ts | 11 + .../resources/reqWithHeaders/client/index.ts | 1 + .../resources/reqWithHeaders/index.ts | 1 + .../serialization/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 18 + .../types/resources/docs/types/index.ts | 1 + .../resources/types/resources/enum/index.ts | 1 + .../resources/enum/types/WeatherReport.ts | 14 + .../types/resources/enum/types/index.ts | 1 + .../resources/types/resources/index.ts | 8 + .../resources/types/resources/object/index.ts | 1 + .../resources/object/types/DoubleOptional.ts | 19 + .../types/NestedObjectWithOptionalField.ts | 21 + .../types/NestedObjectWithRequiredField.ts | 21 + .../object/types/ObjectWithMapOfMap.ts | 21 + .../object/types/ObjectWithOptionalField.ts | 42 + .../object/types/ObjectWithRequiredField.ts | 18 + .../resources/object/types/OptionalAlias.ts | 14 + .../types/resources/object/types/index.ts | 7 + .../resources/types/resources/union/index.ts | 1 + .../types/resources/union/types/Animal.ts | 30 + .../types/resources/union/types/Cat.ts | 18 + .../types/resources/union/types/Dog.ts | 18 + .../types/resources/union/types/index.ts | 3 + .../serde-layer-zurg/src/version.ts | 1 + .../serde-layer-zurg/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../serde-layer-zurg/tests/setup.ts | 80 + .../serde-layer-zurg/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/schemas/bigint/bigint.test.ts | 46 + .../tests/unit/schemas/date/date.test.ts | 31 + .../tests/unit/schemas/enum/enum.test.ts | 30 + .../tests/unit/schemas/lazy/lazy.test.ts | 57 + .../unit/schemas/lazy/lazyObject.test.ts | 18 + .../tests/unit/schemas/lazy/recursive/a.ts | 7 + .../tests/unit/schemas/lazy/recursive/b.ts | 8 + .../tests/unit/schemas/list/list.test.ts | 41 + .../schemas/literals/stringLiteral.test.ts | 21 + .../object-like/withParsedProperties.test.ts | 57 + .../tests/unit/schemas/object/extend.test.ts | 89 + .../tests/unit/schemas/object/object.test.ts | 255 ++ .../objectWithoutOptionalProperties.test.ts | 21 + .../unit/schemas/object/passthrough.test.ts | 87 + .../tests/unit/schemas/primitives/any.test.ts | 6 + .../unit/schemas/primitives/boolean.test.ts | 14 + .../unit/schemas/primitives/never.test.ts | 54 + .../unit/schemas/primitives/number.test.ts | 14 + .../unit/schemas/primitives/string.test.ts | 14 + .../unit/schemas/primitives/unknown.test.ts | 6 + .../tests/unit/schemas/record/record.test.ts | 34 + .../schema-utils/getSchemaUtils.test.ts | 83 + .../tests/unit/schemas/schema.test.ts | 78 + .../tests/unit/schemas/set/set.test.ts | 48 + .../tests/unit/schemas/skipValidation.test.ts | 44 + .../undiscriminatedUnion.test.ts | 44 + .../tests/unit/schemas/union/union.test.ts | 113 + .../tests/unit/schemas/utils/itSchema.ts | 78 + .../tests/unit/schemas/utils/itValidate.ts | 56 + .../tests/unit/url/join.test.ts | 284 ++ .../tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-zurg/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-zurg/tsconfig.base.json | 18 + .../serde-layer-zurg/tsconfig.cjs.json | 9 + .../serde-layer-zurg/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-zurg/tsconfig.json | 3 + .../serde-layer-zurg/vitest.config.mts | 28 + 898 files changed, 55968 insertions(+) create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json new file mode 100644 index 000000000000..48f29b85d5d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "none" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/README.md b/seed/ts-sdk/exhaustive/serde-layer-none/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +
+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/biome.json b/seed/ts-sdk/exhaustive/serde-layer-none/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/package.json b/seed/ts-sdk/exhaustive/serde-layer-none/package.json new file mode 100644 index 000000000000..d78462fbefd6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/package.json @@ -0,0 +1,66 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": {}, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/reference.md b/seed/ts-sdk/exhaustive/serde-layer-none/reference.md new file mode 100644 index 000000000000..c7d4e874e8a2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json new file mode 100644 index 000000000000..33399dc5484e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives([\"string\"]);\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(\"2024-01-15T09:30:00Z\");\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n \"X-TEST-SERVICE-HEADER\": \"X-TEST-SERVICE-HEADER\",\n \"X-TEST-ENDPOINT-HEADER\": \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts new file mode 100644 index 000000000000..f28de2b4c43c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts @@ -0,0 +1,82 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export interface BaseClientOptions { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + token?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts new file mode 100644 index 000000000000..d5ca904d9544 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..b124def3d861 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export interface Options extends BaseClientOptions {} +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..dd50598a34d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,458 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string[], rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]) + */ + public getAndReturnSetOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string[], rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as Record, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as Record, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request != null ? request : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField | undefined, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..0dcd19c50614 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,171 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..f15447a67ae8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,80 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as SeedExhaustive.types.WeatherReport, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..9383ef15a189 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,334 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as boolean, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..3a67887dbd74 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,522 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithMapOfMap, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.NestedObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..890bfd8293e6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,522 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: _body, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..98244a13252b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,535 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; + +export declare namespace PrimitiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as number, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as number, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as number, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as boolean, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z") + */ + public getAndReturnDatetime( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..5c4e4edf4e39 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,80 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as SeedExhaustive.endpoints.PutResponse, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..fe75d063f585 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,84 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as SeedExhaustive.types.Animal, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..955bb036344f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,210 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; + +export declare namespace UrlsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..b2a084be5dbd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,110 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + _response.error.body as SeedExhaustive.BadObjectRequestInfo, + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..b20679ee1c90 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + NestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..cefce5ee90bd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,89 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as boolean, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + _response.error.body as SeedExhaustive.BadObjectRequestInfo, + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..dbf262403321 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,126 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..29b39fb91fdd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + body: _body, + } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: _body, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..4b2e6816729b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + "X-TEST-SERVICE-HEADER": string; + "X-TEST-ENDPOINT-HEADER": string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..b7fddd5d2018 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + NestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..ae3312eae621 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + NestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..47615d58f541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: string; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: string[]; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..b556b3f7bd94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface Options { + token?: core.Supplier; + } +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts new file mode 100644 index 000000000000..92290bfadcac --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts @@ -0,0 +1,6 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts new file mode 100644 index 000000000000..9ebdde6391a5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts @@ -0,0 +1,5 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..5a3250cc64ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); + expect(response).toEqual(["string"]); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..f6336d860bd7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..aab4d5b86ec7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..8169463c8368 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..7797a100db7b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); + expect(response).toEqual("2024-01-15T09:30:00Z"); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..74529a1788fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..7aec8c7699f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a2295047e422 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json new file mode 100644 index 000000000000..4a881bff00a8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "zod" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/README.md b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +
+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/package.json b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json new file mode 100644 index 000000000000..20397bfc4323 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json @@ -0,0 +1,80 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./serialization": { + "types": "./dist/cjs/serialization/index.d.ts", + "import": { + "types": "./dist/esm/serialization/index.d.mts", + "default": "./dist/esm/serialization/index.mjs" + }, + "require": { + "types": "./dist/cjs/serialization/index.d.ts", + "default": "./dist/cjs/serialization/index.js" + }, + "default": "./dist/cjs/serialization/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": { + "zod": "^3.23.0" + }, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md new file mode 100644 index 000000000000..b571afcab9fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Set` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Date` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json new file mode 100644 index 000000000000..875b76c4bb57 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts new file mode 100644 index 000000000000..f28de2b4c43c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts @@ -0,0 +1,82 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export interface BaseClientOptions { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + token?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts new file mode 100644 index 000000000000..d5ca904d9544 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..b124def3d861 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export interface Options extends BaseClientOptions {} +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..c0baf9ea476d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,468 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfObjects.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {Set} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) + */ + public getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfObjects.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request != null ? request : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnOptional.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..361c0fee01c9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,171 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..74c54017a8c9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,81 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: serializers.types.WeatherReport.parse(_response.body), rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..489b113dc93a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,341 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testGet.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testDelete.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..def6861d9cd1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,523 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithRequiredField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithMapOfMap.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithOptionalField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..0e3fc1743459 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,535 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithPath.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithInlinePath.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithPath.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: _body, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithInlinePath.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..7b08ff318060 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,563 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace PrimitiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnString.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnInt.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnLong.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDouble.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBool.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {Date} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) + */ + public getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDatetime.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDate.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnUuid.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBase64.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..b968821f2452 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,84 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.PutResponse.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..6edc8390b8bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,85 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: serializers.types.Animal.parse(_response.body), rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..eb85e22bde0a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,223 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace UrlsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withMixedCase.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.noEndingSlash.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withEndingSlash.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withUnderscores.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..a3510e8330e0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,111 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parse(_response.error.body), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..15d3f75bc67d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..6a13bf7af0d4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noAuth.postWithNoAuth.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parse(_response.error.body), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..7c2f33d1ea28 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,130 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noReqBody.postWithNoRequestBody.Response.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..2d241aeaa762 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,89 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: _body, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..b7fce3790bf5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + xTestServiceHeader: string; + xTestEndpointHeader: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..324bb2e73908 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..322dcfbd5c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..2e6b3811b575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: Date; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: Set; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..b556b3f7bd94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface Options { + token?: core.Supplier; + } +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts new file mode 100644 index 000000000000..92290bfadcac --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts @@ -0,0 +1,6 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts new file mode 100644 index 000000000000..9f0bdd34e0d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts @@ -0,0 +1,6 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; +export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts new file mode 100644 index 000000000000..00a6afb4836c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -0,0 +1,25 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: z.ZodType< + SeedExhaustive.types.ObjectWithRequiredField[], + any, + serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw +> = z.array(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: z.ZodType< + SeedExhaustive.types.ObjectWithRequiredField[], + any, + serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw +> = z.array(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts new file mode 100644 index 000000000000..a4b45466dade --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -0,0 +1,23 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType< + string[], + any, + serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw +> = z.array(z.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: z.ZodType< + string[], + any, + serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw +> = z.array(z.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts new file mode 100644 index 000000000000..166bd3e29a62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -0,0 +1,25 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: z.ZodType< + Record, + any, + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw +> = z.record(z.string(), ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: z.ZodType< + Record, + any, + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw +> = z.record(z.string(), ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts new file mode 100644 index 000000000000..30de46f1edeb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -0,0 +1,23 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType< + Record, + any, + serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw +> = z.record(z.string(), z.string()); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: z.ZodType< + Record, + any, + serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw +> = z.record(z.string(), z.string()); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts new file mode 100644 index 000000000000..f2897ba77737 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -0,0 +1,25 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: z.ZodType< + SeedExhaustive.types.ObjectWithRequiredField | undefined, + any, + serializers.endpoints.container.getAndReturnOptional.Request.Raw +> = ObjectWithRequiredField.optional(); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} + +export const Response: z.ZodType< + SeedExhaustive.types.ObjectWithRequiredField | undefined, + any, + serializers.endpoints.container.getAndReturnOptional.Response.Raw +> = ObjectWithRequiredField.optional(); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts new file mode 100644 index 000000000000..32656770c952 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -0,0 +1,25 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: z.ZodType< + SeedExhaustive.types.ObjectWithRequiredField[], + any, + serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw +> = z.array(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: z.ZodType< + SeedExhaustive.types.ObjectWithRequiredField[], + any, + serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw +> = z.array(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts new file mode 100644 index 000000000000..079965c08bd3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -0,0 +1,23 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType< + Set, + any, + serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw +> = z.set(z.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: z.ZodType< + Set, + any, + serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw +> = z.set(z.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..1972f5b270f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1,7 @@ +export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; +export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; +export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; +export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; +export * as getAndReturnOptional from "./getAndReturnOptional.js"; +export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; +export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..e053119b972c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1,2 @@ +export * as testDelete from "./testDelete.js"; +export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts new file mode 100644 index 000000000000..2f4ecf18a328 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts new file mode 100644 index 000000000000..551bd2fcdbbb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..cd7e640937da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts @@ -0,0 +1,8 @@ +export * as container from "./container/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts new file mode 100644 index 000000000000..7f43f3e26ad6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; + +export const Request: z.ZodType< + SeedExhaustive.types.NestedObjectWithRequiredField[], + any, + serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw +> = z.array(NestedObjectWithRequiredField); + +export declare namespace Request { + export type Raw = NestedObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..d00c4c582910 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts new file mode 100644 index 000000000000..b81110872ebf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts new file mode 100644 index 000000000000..430211bcc6dd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..b30603cae602 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1,4 @@ +export * as getWithInlinePath from "./getWithInlinePath.js"; +export * as getWithPath from "./getWithPath.js"; +export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; +export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts new file mode 100644 index 000000000000..d20ce2e56863 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -0,0 +1,17 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = + z.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: z.ZodType = + z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts new file mode 100644 index 000000000000..0031f1c12180 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = z.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts new file mode 100644 index 000000000000..3e190f6f2509 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -0,0 +1,17 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = + z.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: z.ZodType = + z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts new file mode 100644 index 000000000000..4f3b9ad120db --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -0,0 +1,17 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = + z.boolean(); + +export declare namespace Request { + export type Raw = boolean; +} + +export const Response: z.ZodType = + z.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts new file mode 100644 index 000000000000..955f63f9f365 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = z.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: z.ZodType = + z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts new file mode 100644 index 000000000000..479858888358 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = z + .string() + .transform((s) => new Date(s)); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: z.ZodType = z + .string() + .transform((s) => new Date(s)); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts new file mode 100644 index 000000000000..d1732819ad82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -0,0 +1,17 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = + z.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: z.ZodType = + z.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts new file mode 100644 index 000000000000..30ebed457d14 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = z.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: z.ZodType = + z.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts new file mode 100644 index 000000000000..8d873f768a88 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = z.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: z.ZodType = + z.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts new file mode 100644 index 000000000000..0bf6bc44aef3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -0,0 +1,17 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = + z.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: z.ZodType = + z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts new file mode 100644 index 000000000000..0802f58c03cb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Request: z.ZodType = z.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: z.ZodType = + z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..9805ab86b129 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1,9 @@ +export * as getAndReturnBase64 from "./getAndReturnBase64.js"; +export * as getAndReturnBool from "./getAndReturnBool.js"; +export * as getAndReturnDate from "./getAndReturnDate.js"; +export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; +export * as getAndReturnDouble from "./getAndReturnDouble.js"; +export * as getAndReturnInt from "./getAndReturnInt.js"; +export * as getAndReturnLong from "./getAndReturnLong.js"; +export * as getAndReturnString from "./getAndReturnString.js"; +export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..fbc0172f82b8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCategory: z.ZodType< + SeedExhaustive.endpoints.ErrorCategory, + any, + serializers.endpoints.ErrorCategory.Raw +> = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); + +export declare namespace ErrorCategory { + export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..7151824dddec --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCode: z.ZodType = + z.enum([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", + ]); + +export declare namespace ErrorCode { + export type Raw = + | "INTERNAL_SERVER_ERROR" + | "UNAUTHORIZED" + | "FORBIDDEN" + | "BAD_REQUEST" + | "CONFLICT" + | "GONE" + | "UNPROCESSABLE_ENTITY" + | "NOT_IMPLEMENTED" + | "BAD_GATEWAY" + | "SERVICE_UNAVAILABLE" + | "Unknown"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..c6587a43a510 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,23 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ErrorCategory } from "./ErrorCategory.js"; +import { ErrorCode } from "./ErrorCode.js"; + +export const Error_: z.ZodObject = + z.object({ + category: ErrorCategory, + code: ErrorCode, + detail: z.string().optional(), + field: z.string().optional(), + }); + +export declare namespace Error_ { + export interface Raw { + category: ErrorCategory.Raw; + code: ErrorCode.Raw; + detail?: string | null; + field?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..d53589715c26 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Error_ } from "./Error_.js"; + +export const PutResponse: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.endpoints.PutResponse, + serializers.endpoints.PutResponse.Raw +> = z.object({ + errors: z.array(Error_).optional(), +}); + +export declare namespace PutResponse { + export interface Raw { + errors?: Error_.Raw[] | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..66e101cdc2d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1,4 @@ +export * as noEndingSlash from "./noEndingSlash.js"; +export * as withEndingSlash from "./withEndingSlash.js"; +export * as withMixedCase from "./withMixedCase.js"; +export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts new file mode 100644 index 000000000000..b2b91c040278 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts new file mode 100644 index 000000000000..5cd391fdb98b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts new file mode 100644 index 000000000000..70eb829ab641 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts new file mode 100644 index 000000000000..9fe73dc611c5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..d1f725aa0f13 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../api/index.js"; +import type * as serializers from "../../../index.js"; + +export const BadObjectRequestInfo: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.BadObjectRequestInfo, + serializers.BadObjectRequestInfo.Raw +> = z.object({ + message: z.string(), +}); + +export declare namespace BadObjectRequestInfo { + export interface Raw { + message: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts new file mode 100644 index 000000000000..20b614a89e2f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts @@ -0,0 +1,9 @@ +export * as endpoints from "./endpoints/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..c2ce70ab5e4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../api/index.js"; +import type * as serializers from "../../../../index.js"; +import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; + +export const PostWithObjectBody: z.ZodType = + z + .object({ + string: z.string(), + integer: z.number(), + NestedObject: ObjectWithOptionalField, + }) + .transform((data) => ({ + string: data.string, + integer: data.integer, + nestedObject: data.NestedObject, + })); + +export declare namespace PostWithObjectBody { + export interface Raw { + string: string; + integer: number; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..d62a81ce61fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..549edcdba7f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts new file mode 100644 index 000000000000..10d91fcc521f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../index.js"; + +export const Response: z.ZodType = z.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..b62616349ec6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts new file mode 100644 index 000000000000..b00329f8b977 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../index.js"; + +export const Response: z.ZodType = z.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts new file mode 100644 index 000000000000..63acac04813a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as serializers from "../../../index.js"; + +export const Request: z.ZodType = z.string(); + +export declare namespace Request { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..fb7f25afb170 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..e4299f7d9a53 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithDocs: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.types.ObjectWithDocs, + serializers.types.ObjectWithDocs.Raw +> = z.object({ + string: z.string(), +}); + +export declare namespace ObjectWithDocs { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..f87a46f92c84 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const WeatherReport: z.ZodType = + z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); + +export declare namespace WeatherReport { + export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts new file mode 100644 index 000000000000..52175f3cee16 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts @@ -0,0 +1,8 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..d96691c18bcc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { OptionalAlias } from "./OptionalAlias.js"; + +export const DoubleOptional: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.types.DoubleOptional, + serializers.types.DoubleOptional.Raw +> = z.object({ + optionalAlias: OptionalAlias.optional(), +}); + +export declare namespace DoubleOptional { + export interface Raw { + optionalAlias?: (OptionalAlias.Raw | undefined) | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..056015a99f36 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,28 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithOptionalField: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.types.NestedObjectWithOptionalField, + serializers.types.NestedObjectWithOptionalField.Raw +> = z + .object({ + string: z.string().optional(), + NestedObject: ObjectWithOptionalField.optional(), + }) + .transform((data) => ({ + string: data.string, + nestedObject: data.NestedObject, + })); + +export declare namespace NestedObjectWithOptionalField { + export interface Raw { + string?: string | null; + NestedObject?: ObjectWithOptionalField.Raw | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..d67da1f455a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,28 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithRequiredField: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.types.NestedObjectWithRequiredField, + serializers.types.NestedObjectWithRequiredField.Raw +> = z + .object({ + string: z.string(), + NestedObject: ObjectWithOptionalField, + }) + .transform((data) => ({ + string: data.string, + nestedObject: data.NestedObject, + })); + +export declare namespace NestedObjectWithRequiredField { + export interface Raw { + string: string; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..3aa689a9dcf5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithMapOfMap: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.types.ObjectWithMapOfMap, + serializers.types.ObjectWithMapOfMap.Raw +> = z.object({ + map: z.record(z.string(), z.record(z.string(), z.string())), +}); + +export declare namespace ObjectWithMapOfMap { + export interface Raw { + map: Record>; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..18c6e41f8929 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,47 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithOptionalField: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.types.ObjectWithOptionalField, + serializers.types.ObjectWithOptionalField.Raw +> = z.object({ + string: z.string().optional(), + integer: z.number().optional(), + long: z.number().optional(), + double: z.number().optional(), + bool: z.boolean().optional(), + datetime: z + .string() + .transform((s) => new Date(s)) + .optional(), + date: z.string().optional(), + uuid: z.string().optional(), + base64: z.string().optional(), + list: z.array(z.string()).optional(), + set: z.set(z.string()).optional(), + map: z.record(z.number(), z.string()).optional(), + bigint: z.string().optional(), +}); + +export declare namespace ObjectWithOptionalField { + export interface Raw { + string?: string | null; + integer?: number | null; + long?: number | null; + double?: number | null; + bool?: boolean | null; + datetime?: string | null; + date?: string | null; + uuid?: string | null; + base64?: string | null; + list?: string[] | null; + set?: string[] | null; + map?: Record | null; + bigint?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..c111b94b9bde --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithRequiredField: z.ZodObject< + any, + "strip", + any, + SeedExhaustive.types.ObjectWithRequiredField, + serializers.types.ObjectWithRequiredField.Raw +> = z.object({ + string: z.string(), +}); + +export declare namespace ObjectWithRequiredField { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..e859962c98ad --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,12 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const OptionalAlias: z.ZodType = z + .string() + .optional(); + +export declare namespace OptionalAlias { + export type Raw = string | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..d9988551eff7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,25 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Cat } from "./Cat.js"; +import { Dog } from "./Dog.js"; + +export const Animal: z.ZodType = z + .discriminatedUnion("animal", [ + z.object({ animal: z.literal("dog") }).merge(Dog), + z.object({ animal: z.literal("cat") }).merge(Cat), + ]) + .transform((value) => value); + +export declare namespace Animal { + export type Raw = Animal.Dog | Animal.Cat; + + export interface Dog extends Dog.Raw { + animal: "dog"; + } + + export interface Cat extends Cat.Raw { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..62b3cd160a2e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Cat: z.ZodObject = z.object({ + name: z.string(), + likesToMeow: z.boolean(), +}); + +export declare namespace Cat { + export interface Raw { + name: string; + likesToMeow: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..86c0a7ebbb2e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Dog: z.ZodObject = z.object({ + name: z.string(), + likesToWoof: z.boolean(), +}); + +export declare namespace Dog { + export interface Raw { + name: string; + likesToWoof: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..98b9ec0c58b9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + expect(response).toEqual(new Set(["string"])); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..4bc8916f7ce5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..b9e26c032ff9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..685826602e5e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..650fc620bb1d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..61b5a64bce8f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..8f5f6a59a512 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a128d4844ba2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json new file mode 100644 index 000000000000..bc0673c609b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "zurg" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +
+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json new file mode 100644 index 000000000000..ac3de0f37468 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json @@ -0,0 +1,78 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./serialization": { + "types": "./dist/cjs/serialization/index.d.ts", + "import": { + "types": "./dist/esm/serialization/index.d.mts", + "default": "./dist/esm/serialization/index.mjs" + }, + "require": { + "types": "./dist/cjs/serialization/index.d.ts", + "default": "./dist/cjs/serialization/index.js" + }, + "default": "./dist/cjs/serialization/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": {}, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md new file mode 100644 index 000000000000..b571afcab9fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Set` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Date` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json new file mode 100644 index 000000000000..875b76c4bb57 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts new file mode 100644 index 000000000000..f28de2b4c43c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts @@ -0,0 +1,82 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export interface BaseClientOptions { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + token?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts new file mode 100644 index 000000000000..d5ca904d9544 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..b124def3d861 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export interface Options extends BaseClientOptions {} +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..32bb0a7fc21e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,543 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfObjects.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfObjects.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {Set} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) + */ + public getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfObjects.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: + request != null + ? serializers.endpoints.container.getAndReturnOptional.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }) + : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnOptional.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..75f492ac343f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,178 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..9c9b0cd87c76 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.WeatherReport.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.WeatherReport.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..0298be639cde --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,380 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testGet.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testDelete.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..f7bbef9f5c00 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,577 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithMapOfMap.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithMapOfMap.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..e26b85a0f305 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,565 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithPath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithInlinePath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithPath.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithPath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithInlinePath.Request.jsonOrThrow(_body, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithInlinePath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..22ff4d032983 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,644 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace PrimitiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnString.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnString.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnInt.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnInt.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnLong.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnLong.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDouble.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDouble.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBool.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBool.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {Date} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) + */ + public getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDatetime.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDatetime.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDate.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDate.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnUuid.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnUuid.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBase64.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBase64.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..d3c0b566a0e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,90 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.PutResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..8ebfb6371c4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,97 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.Animal.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.Animal.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..6eee97a8bd78 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,247 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace UrlsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withMixedCase.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.noEndingSlash.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withEndingSlash.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withUnderscores.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..08c808a10650 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,126 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.PostWithObjectBody.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..15d3f75bc67d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..52430c224d0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,105 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noAuth.postWithNoAuth.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..055fc0084e37 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,142 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noReqBody.postWithNoRequestBody.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..a645609a3c92 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.reqWithHeaders.getWithCustomHeader.Request.jsonOrThrow(_body, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..b7fce3790bf5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + xTestServiceHeader: string; + xTestEndpointHeader: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..324bb2e73908 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..322dcfbd5c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..2e6b3811b575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: Date; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: Set; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..b556b3f7bd94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface Options { + token?: core.Supplier; + } +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts new file mode 100644 index 000000000000..874173e71808 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts @@ -0,0 +1,7 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as serialization from "./schemas/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts new file mode 100644 index 000000000000..4cd8b1d95934 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts @@ -0,0 +1,103 @@ +import type { SchemaUtils } from "./builders/index.js"; + +export type Schema = BaseSchema & SchemaUtils; + +export type inferRaw = S extends Schema ? Raw : never; +export type inferParsed = S extends Schema ? Parsed : never; + +export interface BaseSchema { + parse: (raw: unknown, opts?: SchemaOptions) => MaybeValid; + json: (parsed: unknown, opts?: SchemaOptions) => MaybeValid; + getType: () => SchemaType | SchemaType; +} + +export const SchemaType = { + BIGINT: "bigint", + DATE: "date", + ENUM: "enum", + LIST: "list", + STRING_LITERAL: "stringLiteral", + BOOLEAN_LITERAL: "booleanLiteral", + OBJECT: "object", + ANY: "any", + BOOLEAN: "boolean", + NUMBER: "number", + STRING: "string", + UNKNOWN: "unknown", + NEVER: "never", + RECORD: "record", + SET: "set", + UNION: "union", + UNDISCRIMINATED_UNION: "undiscriminatedUnion", + NULLABLE: "nullable", + OPTIONAL: "optional", + OPTIONAL_NULLABLE: "optionalNullable", +} as const; + +export type SchemaType = (typeof SchemaType)[keyof typeof SchemaType]; + +export type MaybeValid = Valid | Invalid; + +export interface Valid { + ok: true; + value: T; +} + +export interface Invalid { + ok: false; + errors: ValidationError[]; +} + +export interface ValidationError { + path: string[]; + message: string; +} + +export interface SchemaOptions { + /** + * how to handle unrecognized keys in objects + * + * @default "fail" + */ + unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; + + /** + * whether to fail when an unrecognized discriminant value is + * encountered in a union + * + * @default false + */ + allowUnrecognizedUnionMembers?: boolean; + + /** + * whether to fail when an unrecognized enum value is encountered + * + * @default false + */ + allowUnrecognizedEnumValues?: boolean; + + /** + * whether to allow data that doesn't conform to the schema. + * invalid data is passed through without transformation. + * + * when this is enabled, .parse() and .json() will always + * return `ok: true`. `.parseOrThrow()` and `.jsonOrThrow()` + * will never fail. + * + * @default false + */ + skipValidation?: boolean; + + /** + * each validation failure contains a "path" property, which is + * the breadcrumbs to the offending node in the JSON. you can supply + * a prefix that is prepended to all the errors' paths. this can be + * helpful for zurg's internal debug logging. + */ + breadcrumbsPrefix?: string[]; + + /** + * whether to send 'null' for optional properties explicitly set to 'undefined'. + */ + omitUndefined?: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts new file mode 100644 index 000000000000..2c7c74c54a37 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts @@ -0,0 +1,55 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function bigint(): Schema { + const baseSchema: BaseSchema = { + parse: (raw, { breadcrumbsPrefix = [] } = {}) => { + if (typeof raw === "bigint") { + return { + ok: true, + value: raw, + }; + } + if (typeof raw === "number") { + return { + ok: true, + value: BigInt(raw), + }; + } + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "bigint | number"), + }, + ], + }; + }, + json: (bigint, { breadcrumbsPrefix = [] } = {}) => { + if (typeof bigint !== "bigint") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(bigint, "bigint"), + }, + ], + }; + } + return { + ok: true, + value: bigint, + }; + }, + getType: () => SchemaType.BIGINT, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts new file mode 100644 index 000000000000..13cc76e25b2a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts @@ -0,0 +1 @@ +export { bigint } from "./bigint.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts new file mode 100644 index 000000000000..f02e3367f88f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts @@ -0,0 +1,65 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +// https://stackoverflow.com/questions/12756159/regex-and-iso8601-formatted-datetime +const ISO_8601_REGEX = + /^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([.,]\d+(?!:))?)?(\17[0-5]\d([.,]\d+)?)?([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; + +export function date(): Schema { + const baseSchema: BaseSchema = { + parse: (raw, { breadcrumbsPrefix = [] } = {}) => { + if (typeof raw !== "string") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "string"), + }, + ], + }; + } + if (!ISO_8601_REGEX.test(raw)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "ISO 8601 date string"), + }, + ], + }; + } + return { + ok: true, + value: new Date(raw), + }; + }, + json: (date, { breadcrumbsPrefix = [] } = {}) => { + if (date instanceof Date) { + return { + ok: true, + value: date.toISOString(), + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(date, "Date object"), + }, + ], + }; + } + }, + getType: () => SchemaType.DATE, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts new file mode 100644 index 000000000000..e22a2f16bfc9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts @@ -0,0 +1 @@ +export { date } from "./date.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts new file mode 100644 index 000000000000..ccae24bcf200 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts @@ -0,0 +1,43 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function enum_(values: E): Schema { + const validValues = new Set(values); + + const schemaCreator = createIdentitySchemaCreator( + SchemaType.ENUM, + (value, { allowUnrecognizedEnumValues, breadcrumbsPrefix = [] } = {}) => { + if (typeof value !== "string") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "string"), + }, + ], + }; + } + + if (!validValues.has(value) && !allowUnrecognizedEnumValues) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "enum"), + }, + ], + }; + } + + return { + ok: true, + value: value as U, + }; + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts new file mode 100644 index 000000000000..ff3bee3bf653 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts @@ -0,0 +1 @@ +export { enum_ } from "./enum.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts new file mode 100644 index 000000000000..ddb9b3c94555 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts @@ -0,0 +1,14 @@ +export * from "./bigint/index.js"; +export * from "./date/index.js"; +export * from "./enum/index.js"; +export * from "./lazy/index.js"; +export * from "./list/index.js"; +export * from "./literals/index.js"; +export * from "./object/index.js"; +export * from "./object-like/index.js"; +export * from "./primitives/index.js"; +export * from "./record/index.js"; +export * from "./schema-utils/index.js"; +export * from "./set/index.js"; +export * from "./undiscriminated-union/index.js"; +export * from "./union/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts new file mode 100644 index 000000000000..e8ca40992061 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts @@ -0,0 +1,3 @@ +export type { SchemaGetter } from "./lazy.js"; +export { lazy } from "./lazy.js"; +export { lazyObject } from "./lazyObject.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts new file mode 100644 index 000000000000..37f28871683a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts @@ -0,0 +1,32 @@ +import type { BaseSchema, Schema } from "../../Schema.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export type SchemaGetter> = () => SchemaType; + +export function lazy(getter: SchemaGetter>): Schema { + const baseSchema = constructLazyBaseSchema(getter); + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function constructLazyBaseSchema( + getter: SchemaGetter>, +): BaseSchema { + return { + parse: (raw, opts) => getMemoizedSchema(getter).parse(raw, opts), + json: (parsed, opts) => getMemoizedSchema(getter).json(parsed, opts), + getType: () => getMemoizedSchema(getter).getType(), + }; +} + +type MemoizedGetter> = SchemaGetter & { __zurg_memoized?: SchemaType }; + +export function getMemoizedSchema>(getter: SchemaGetter): SchemaType { + const castedGetter = getter as MemoizedGetter; + if (castedGetter.__zurg_memoized == null) { + castedGetter.__zurg_memoized = getter(); + } + return castedGetter.__zurg_memoized; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts new file mode 100644 index 000000000000..192c90e5c83e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts @@ -0,0 +1,20 @@ +import { getObjectUtils } from "../object/index.js"; +import type { BaseObjectSchema, ObjectSchema } from "../object/types.js"; +import { getObjectLikeUtils } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import { constructLazyBaseSchema, getMemoizedSchema, type SchemaGetter } from "./lazy.js"; + +export function lazyObject(getter: SchemaGetter>): ObjectSchema { + const baseSchema: BaseObjectSchema = { + ...constructLazyBaseSchema(getter), + _getRawProperties: () => getMemoizedSchema(getter)._getRawProperties(), + _getParsedProperties: () => getMemoizedSchema(getter)._getParsedProperties(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts new file mode 100644 index 000000000000..021f1e4df1ff --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts @@ -0,0 +1 @@ +export { list } from "./list.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts new file mode 100644 index 000000000000..4f8c10ba483a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts @@ -0,0 +1,73 @@ +import { type BaseSchema, type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function list(schema: Schema): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => + validateAndTransformArray(raw, (item, index) => + schema.parse(item, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], + }), + ), + json: (parsed, opts) => + validateAndTransformArray(parsed, (item, index) => + schema.json(item, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], + }), + ), + getType: () => SchemaType.LIST, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformArray( + value: unknown, + transformItem: (item: Raw, index: number) => MaybeValid, +): MaybeValid { + if (!Array.isArray(value)) { + return { + ok: false, + errors: [ + { + message: getErrorMessageForIncorrectType(value, "list"), + path: [], + }, + ], + }; + } + + const maybeValidItems = value.map((item, index) => transformItem(item, index)); + + return maybeValidItems.reduce>( + (acc, item) => { + if (acc.ok && item.ok) { + return { + ok: true, + value: [...acc.value, item.value], + }; + } + + const errors: ValidationError[] = []; + if (!acc.ok) { + errors.push(...acc.errors); + } + if (!item.ok) { + errors.push(...item.errors); + } + + return { + ok: false, + errors, + }; + }, + { ok: true, value: [] }, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts new file mode 100644 index 000000000000..db5d2c7a7313 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function booleanLiteral(literal: V): Schema { + const schemaCreator = createIdentitySchemaCreator( + SchemaType.BOOLEAN_LITERAL, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (value === literal) { + return { + ok: true, + value: literal, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, `${literal.toString()}`), + }, + ], + }; + } + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts new file mode 100644 index 000000000000..4a4ab39d91a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts @@ -0,0 +1,2 @@ +export { booleanLiteral } from "./booleanLiteral.js"; +export { stringLiteral } from "./stringLiteral.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts new file mode 100644 index 000000000000..ce6e20caf8d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function stringLiteral(literal: V): Schema { + const schemaCreator = createIdentitySchemaCreator( + SchemaType.STRING_LITERAL, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (value === literal) { + return { + ok: true, + value: literal, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, `"${literal}"`), + }, + ], + }; + } + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts new file mode 100644 index 000000000000..af69acb01dc1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts @@ -0,0 +1,79 @@ +import type { BaseSchema } from "../../Schema.js"; +import { filterObject } from "../../utils/filterObject.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; + +export function getObjectLikeUtils(schema: BaseSchema): ObjectLikeUtils { + return { + withParsedProperties: (properties) => withParsedProperties(schema, properties), + }; +} + +/** + * object-like utils are defined in one file to resolve issues with circular imports + */ + +export function withParsedProperties( + objectLike: BaseSchema, + properties: { [K in keyof Properties]: Properties[K] | ((parsed: ParsedObjectShape) => Properties[K]) }, +): ObjectLikeSchema { + const objectSchema: BaseSchema = { + parse: (raw, opts) => { + const parsedObject = objectLike.parse(raw, opts); + if (!parsedObject.ok) { + return parsedObject; + } + + const additionalProperties = Object.entries(properties).reduce>( + (processed, [key, value]) => { + return { + ...processed, + [key]: typeof value === "function" ? value(parsedObject.value) : value, + }; + }, + {}, + ); + + return { + ok: true, + value: { + ...parsedObject.value, + ...(additionalProperties as Properties), + }, + }; + }, + + json: (parsed, opts) => { + if (!isPlainObject(parsed)) { + return { + ok: false, + errors: [ + { + path: opts?.breadcrumbsPrefix ?? [], + message: getErrorMessageForIncorrectType(parsed, "object"), + }, + ], + }; + } + + // strip out added properties + const addedPropertyKeys = new Set(Object.keys(properties)); + const parsedWithoutAddedProperties = filterObject( + parsed, + Object.keys(parsed).filter((key) => !addedPropertyKeys.has(key)), + ); + + return objectLike.json(parsedWithoutAddedProperties as ParsedObjectShape, opts); + }, + + getType: () => objectLike.getType(), + }; + + return { + ...objectSchema, + ...getSchemaUtils(objectSchema), + ...getObjectLikeUtils(objectSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts new file mode 100644 index 000000000000..2451ef7d0e50 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts @@ -0,0 +1,2 @@ +export { getObjectLikeUtils, withParsedProperties } from "./getObjectLikeUtils.js"; +export type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts new file mode 100644 index 000000000000..44b9669108cb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts @@ -0,0 +1,13 @@ +import type { BaseSchema, Schema } from "../../Schema.js"; + +export type ObjectLikeSchema = Schema & + BaseSchema & + ObjectLikeUtils; + +export interface ObjectLikeUtils { + withParsedProperties: >( + properties: { + [K in keyof T]: T[K] | ((parsed: Parsed) => T[K]); + }, + ) => ObjectLikeSchema; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts new file mode 100644 index 000000000000..c6611aaacd3b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts @@ -0,0 +1,22 @@ +export { getObjectUtils, object } from "./object.js"; +export type { + inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas, +} from "./objectWithoutOptionalProperties.js"; +export { objectWithoutOptionalProperties } from "./objectWithoutOptionalProperties.js"; +export type { Property } from "./property.js"; +export { isProperty, property } from "./property.js"; +export type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObject, + inferParsedObjectFromPropertySchemas, + inferParsedPropertySchema, + inferRawKey, + inferRawObject, + inferRawObjectFromPropertySchemas, + inferRawPropertySchema, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts new file mode 100644 index 000000000000..624d4d3888d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts @@ -0,0 +1,382 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { entries } from "../../utils/entries.js"; +import { filterObject } from "../../utils/filterObject.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { keys } from "../../utils/keys.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { partition } from "../../utils/partition.js"; +import { getObjectLikeUtils } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import { isProperty } from "./property.js"; +import type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObjectFromPropertySchemas, + inferRawObjectFromPropertySchemas, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types.js"; + +interface ObjectPropertyWithRawKey { + rawKey: string; + parsedKey: string; + valueSchema: Schema; +} + +export function object>( + schemas: T, +): inferObjectSchemaFromPropertySchemas { + const baseSchema: BaseObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectFromPropertySchemas + > = { + _getRawProperties: () => + Object.entries(schemas).map(([parsedKey, propertySchema]) => + isProperty(propertySchema) ? propertySchema.rawKey : parsedKey, + ) as unknown as (keyof inferRawObjectFromPropertySchemas)[], + _getParsedProperties: () => keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[], + + parse: (raw, opts) => { + const rawKeyToProperty: Record = {}; + const requiredKeys: string[] = []; + + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const rawKey = isProperty(schemaOrObjectProperty) ? schemaOrObjectProperty.rawKey : parsedKey; + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; + + const property: ObjectPropertyWithRawKey = { + rawKey, + parsedKey: parsedKey as string, + valueSchema, + }; + + rawKeyToProperty[rawKey] = property; + + if (isSchemaRequired(valueSchema)) { + requiredKeys.push(rawKey); + } + } + + return validateAndTransformObject({ + value: raw, + requiredKeys, + getProperty: (rawKey) => { + const property = rawKeyToProperty[rawKey]; + if (property == null) { + return undefined; + } + return { + transformedKey: property.parsedKey, + transform: (propertyValue) => + property.valueSchema.parse(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawKey], + }), + }; + }, + unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, + skipValidation: opts?.skipValidation, + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + omitUndefined: opts?.omitUndefined, + }); + }, + + json: (parsed, opts) => { + const requiredKeys: string[] = []; + + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; + + if (isSchemaRequired(valueSchema)) { + requiredKeys.push(parsedKey as string); + } + } + + return validateAndTransformObject({ + value: parsed, + requiredKeys, + getProperty: ( + parsedKey, + ): { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined => { + const property = schemas[parsedKey as keyof T]; + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (property == null) { + return undefined; + } + + if (isProperty(property)) { + return { + transformedKey: property.rawKey, + transform: (propertyValue) => + property.valueSchema.json(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], + }), + }; + } else { + return { + transformedKey: parsedKey, + transform: (propertyValue) => + property.json(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], + }), + }; + } + }, + unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, + skipValidation: opts?.skipValidation, + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + omitUndefined: opts?.omitUndefined, + }); + }, + + getType: () => SchemaType.OBJECT, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} + +function validateAndTransformObject({ + value, + requiredKeys, + getProperty, + unrecognizedObjectKeys = "fail", + skipValidation = false, + breadcrumbsPrefix = [], +}: { + value: unknown; + requiredKeys: string[]; + getProperty: ( + preTransformedKey: string, + ) => { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined; + unrecognizedObjectKeys: "fail" | "passthrough" | "strip" | undefined; + skipValidation: boolean | undefined; + breadcrumbsPrefix: string[] | undefined; + omitUndefined: boolean | undefined; +}): MaybeValid { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const missingRequiredKeys = new Set(requiredKeys); + const errors: ValidationError[] = []; + const transformed: Record = {}; + + for (const [preTransformedKey, preTransformedItemValue] of Object.entries(value)) { + const property = getProperty(preTransformedKey); + + if (property != null) { + missingRequiredKeys.delete(preTransformedKey); + + const value = property.transform(preTransformedItemValue as object); + if (value.ok) { + transformed[property.transformedKey] = value.value; + } else { + transformed[preTransformedKey] = preTransformedItemValue; + errors.push(...value.errors); + } + } else { + switch (unrecognizedObjectKeys) { + case "fail": + errors.push({ + path: [...breadcrumbsPrefix, preTransformedKey], + message: `Unexpected key "${preTransformedKey}"`, + }); + break; + case "strip": + break; + case "passthrough": + transformed[preTransformedKey] = preTransformedItemValue; + break; + } + } + } + + errors.push( + ...requiredKeys + .filter((key) => missingRequiredKeys.has(key)) + .map((key) => ({ + path: breadcrumbsPrefix, + message: `Missing required key "${key}"`, + })), + ); + + if (errors.length === 0 || skipValidation) { + return { + ok: true, + value: transformed as Transformed, + }; + } else { + return { + ok: false, + errors, + }; + } +} + +export function getObjectUtils(schema: BaseObjectSchema): ObjectUtils { + return { + extend: (extension: ObjectSchema) => { + const baseSchema: BaseObjectSchema = { + _getParsedProperties: () => [...schema._getParsedProperties(), ...extension._getParsedProperties()], + _getRawProperties: () => [...schema._getRawProperties(), ...extension._getRawProperties()], + parse: (raw, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: extension._getRawProperties(), + value: raw, + transformBase: (rawBase) => schema.parse(rawBase, opts), + transformExtension: (rawExtension) => extension.parse(rawExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: extension._getParsedProperties(), + value: parsed, + transformBase: (parsedBase) => schema.json(parsedBase, opts), + transformExtension: (parsedExtension) => extension.json(parsedExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.OBJECT, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; + }, + passthrough: () => { + const baseSchema: BaseObjectSchema = + { + _getParsedProperties: () => schema._getParsedProperties(), + _getRawProperties: () => schema._getRawProperties(), + parse: (raw, opts) => { + const transformed = schema.parse(raw, { ...opts, unrecognizedObjectKeys: "passthrough" }); + if (!transformed.ok) { + return transformed; + } + return { + ok: true, + value: { + ...(raw as any), + ...transformed.value, + }, + }; + }, + json: (parsed, opts) => { + const transformed = schema.json(parsed, { ...opts, unrecognizedObjectKeys: "passthrough" }); + if (!transformed.ok) { + return transformed; + } + return { + ok: true, + value: { + ...(parsed as any), + ...transformed.value, + }, + }; + }, + getType: () => SchemaType.OBJECT, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; + }, + }; +} + +function validateAndTransformExtendedObject({ + extensionKeys, + value, + transformBase, + transformExtension, + breadcrumbsPrefix = [], +}: { + extensionKeys: (keyof PreTransformedExtension)[]; + value: unknown; + transformBase: (value: object) => MaybeValid; + transformExtension: (value: object) => MaybeValid; + breadcrumbsPrefix?: string[]; +}): MaybeValid { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const extensionPropertiesSet = new Set(extensionKeys); + const [extensionProperties, baseProperties] = partition(keys(value), (key) => + extensionPropertiesSet.has(key as keyof PreTransformedExtension), + ); + + const transformedBase = transformBase(filterObject(value, baseProperties)); + const transformedExtension = transformExtension(filterObject(value, extensionProperties)); + + if (transformedBase.ok && transformedExtension.ok) { + return { + ok: true, + value: { + ...transformedBase.value, + ...transformedExtension.value, + }, + }; + } else { + return { + ok: false, + errors: [ + ...(transformedBase.ok ? [] : transformedBase.errors), + ...(transformedExtension.ok ? [] : transformedExtension.errors), + ], + }; + } +} + +function isSchemaRequired(schema: Schema): boolean { + return !isSchemaOptional(schema); +} + +function isSchemaOptional(schema: Schema): boolean { + switch (schema.getType()) { + case SchemaType.ANY: + case SchemaType.UNKNOWN: + case SchemaType.OPTIONAL: + case SchemaType.OPTIONAL_NULLABLE: + return true; + default: + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts new file mode 100644 index 000000000000..4d39c862f0c4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts @@ -0,0 +1,23 @@ +import { object } from "./object.js"; +import type { + inferParsedPropertySchema, + inferRawObjectFromPropertySchemas, + ObjectSchema, + PropertySchemas, +} from "./types.js"; + +export function objectWithoutOptionalProperties>( + schemas: T, +): inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas { + return object(schemas) as unknown as inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas; +} + +export type inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas> = + ObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas + >; + +export type inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas> = { + [K in keyof T]: inferParsedPropertySchema; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts new file mode 100644 index 000000000000..d1f9f386aa64 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts @@ -0,0 +1,23 @@ +import type { Schema } from "../../Schema.js"; + +export function property( + rawKey: RawKey, + valueSchema: Schema, +): Property { + return { + rawKey, + valueSchema, + isProperty: true, + }; +} + +export interface Property { + rawKey: RawKey; + valueSchema: Schema; + isProperty: true; +} + +export function isProperty>(maybeProperty: unknown): maybeProperty is O { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return (maybeProperty as O).isProperty; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts new file mode 100644 index 000000000000..735d14fc4cee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts @@ -0,0 +1,73 @@ +import type { BaseSchema, inferParsed, inferRaw, Schema } from "../../Schema.js"; +import type { addQuestionMarksToNullableProperties } from "../../utils/addQuestionMarksToNullableProperties.js"; +import type { ObjectLikeUtils } from "../object-like/index.js"; +import type { SchemaUtils } from "../schema-utils/index.js"; +import type { Property } from "./property.js"; + +export type ObjectSchema = BaseObjectSchema & + ObjectLikeUtils & + ObjectUtils & + SchemaUtils; + +export interface BaseObjectSchema extends BaseSchema { + _getRawProperties: () => (keyof Raw)[]; + _getParsedProperties: () => (keyof Parsed)[]; +} + +export interface ObjectUtils { + extend: ( + schemas: ObjectSchema, + ) => ObjectSchema; + passthrough: () => ObjectSchema; +} + +export type inferRawObject> = O extends ObjectSchema ? Raw : never; + +export type inferParsedObject> = O extends ObjectSchema + ? Parsed + : never; + +export type inferObjectSchemaFromPropertySchemas> = ObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectFromPropertySchemas +>; + +export type inferRawObjectFromPropertySchemas> = + addQuestionMarksToNullableProperties<{ + [ParsedKey in keyof T as inferRawKey]: inferRawPropertySchema; + }>; + +export type inferParsedObjectFromPropertySchemas> = + addQuestionMarksToNullableProperties<{ + [K in keyof T]: inferParsedPropertySchema; + }>; + +export type PropertySchemas = Record< + ParsedKeys, + Property | Schema +>; + +export type inferRawPropertySchema

| Schema> = P extends Property< + any, + infer Raw, + any +> + ? Raw + : P extends Schema + ? inferRaw

+ : never; + +export type inferParsedPropertySchema

| Schema> = P extends Property< + any, + any, + infer Parsed +> + ? Parsed + : P extends Schema + ? inferParsed

+ : never; + +export type inferRawKey< + ParsedKey extends string | number | symbol, + P extends Property | Schema, +> = P extends Property ? Raw : ParsedKey; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts new file mode 100644 index 000000000000..bc4d47fab56e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const any: () => Schema = createIdentitySchemaCreator(SchemaType.ANY, (value) => ({ + ok: true, + value, +})); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts new file mode 100644 index 000000000000..78c3c36284c7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const boolean: () => Schema = createIdentitySchemaCreator( + SchemaType.BOOLEAN, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "boolean") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "boolean"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts new file mode 100644 index 000000000000..7a3ee0154829 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts @@ -0,0 +1,6 @@ +export { any } from "./any.js"; +export { boolean } from "./boolean.js"; +export { never } from "./never.js"; +export { number } from "./number.js"; +export { string } from "./string.js"; +export { unknown } from "./unknown.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts new file mode 100644 index 000000000000..91f85d74c01b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts @@ -0,0 +1,15 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const never: () => Schema = createIdentitySchemaCreator( + SchemaType.NEVER, + (_value, { breadcrumbsPrefix = [] } = {}) => ({ + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: "Expected never", + }, + ], + }), +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts new file mode 100644 index 000000000000..6f16cd462a1b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const number: () => Schema = createIdentitySchemaCreator( + SchemaType.NUMBER, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "number") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "number"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts new file mode 100644 index 000000000000..b29d72ae7ef1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const string: () => Schema = createIdentitySchemaCreator( + SchemaType.STRING, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "string") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "string"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts new file mode 100644 index 000000000000..04514160366f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const unknown: () => Schema = createIdentitySchemaCreator( + SchemaType.UNKNOWN, + (value) => ({ ok: true, value }), +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts new file mode 100644 index 000000000000..b17997f7bf84 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts @@ -0,0 +1,2 @@ +export { record } from "./record.js"; +export type { BaseRecordSchema, RecordSchema } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts new file mode 100644 index 000000000000..a489660399b7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts @@ -0,0 +1,129 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { entries } from "../../utils/entries.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { BaseRecordSchema, RecordSchema } from "./types.js"; + +export function record( + keySchema: Schema, + valueSchema: Schema, +): RecordSchema { + const baseSchema: BaseRecordSchema = { + parse: (raw, opts) => { + return validateAndTransformRecord({ + value: raw, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.parse(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.parse(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return validateAndTransformRecord({ + value: parsed, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.json(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.json(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.RECORD, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformRecord({ + value, + isKeyNumeric, + transformKey, + transformValue, + breadcrumbsPrefix = [], +}: { + value: unknown; + isKeyNumeric: boolean; + transformKey: (key: string | number) => MaybeValid; + transformValue: (value: unknown, key: string | number) => MaybeValid; + breadcrumbsPrefix: string[] | undefined; +}): MaybeValid> { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + return entries(value).reduce>>( + (accPromise, [stringKey, value]) => { + if (value === undefined) { + return accPromise; + } + + const acc = accPromise; + + let key: string | number = stringKey; + if (isKeyNumeric) { + const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; + if (!Number.isNaN(numberKey)) { + key = numberKey; + } + } + const transformedKey = transformKey(key); + + const transformedValue = transformValue(value, key); + + if (acc.ok && transformedKey.ok && transformedValue.ok) { + return { + ok: true, + value: { + ...acc.value, + [transformedKey.value]: transformedValue.value, + }, + }; + } + + const errors: ValidationError[] = []; + if (!acc.ok) { + errors.push(...acc.errors); + } + if (!transformedKey.ok) { + errors.push(...transformedKey.errors); + } + if (!transformedValue.ok) { + errors.push(...transformedValue.errors); + } + + return { + ok: false, + errors, + }; + }, + { ok: true, value: {} as Record }, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts new file mode 100644 index 000000000000..5950b4cbde1e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts @@ -0,0 +1,17 @@ +import type { BaseSchema } from "../../Schema.js"; +import type { SchemaUtils } from "../schema-utils/index.js"; + +export type RecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BaseRecordSchema & + SchemaUtils, Record>; + +export type BaseRecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BaseSchema, Record>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts new file mode 100644 index 000000000000..daee3dc79184 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema.js"; +import { stringifyValidationError } from "./stringifyValidationErrors.js"; + +export class JsonError extends Error { + constructor(public readonly errors: ValidationError[]) { + super(errors.map(stringifyValidationError).join("; ")); + Object.setPrototypeOf(this, JsonError.prototype); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts new file mode 100644 index 000000000000..9facf06159b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema.js"; +import { stringifyValidationError } from "./stringifyValidationErrors.js"; + +export class ParseError extends Error { + constructor(public readonly errors: ValidationError[]) { + super(errors.map(stringifyValidationError).join("; ")); + Object.setPrototypeOf(this, ParseError.prototype); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts new file mode 100644 index 000000000000..3ceaf4e011f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts @@ -0,0 +1,181 @@ +import { type BaseSchema, type Schema, type SchemaOptions, SchemaType } from "../../Schema.js"; +import { JsonError } from "./JsonError.js"; +import { ParseError } from "./ParseError.js"; + +export interface SchemaUtils { + nullable: () => Schema; + optional: () => Schema; + optionalNullable: () => Schema; + transform: (transformer: SchemaTransformer) => Schema; + parseOrThrow: (raw: unknown, opts?: SchemaOptions) => Parsed; + jsonOrThrow: (raw: unknown, opts?: SchemaOptions) => Raw; +} + +export interface SchemaTransformer { + transform: (parsed: Parsed) => Transformed; + untransform: (transformed: any) => Parsed; +} + +export function getSchemaUtils(schema: BaseSchema): SchemaUtils { + return { + nullable: () => nullable(schema), + optional: () => optional(schema), + optionalNullable: () => optionalNullable(schema), + transform: (transformer) => transform(schema, transformer), + parseOrThrow: (raw, opts) => { + const parsed = schema.parse(raw, opts); + if (parsed.ok) { + return parsed.value; + } + throw new ParseError(parsed.errors); + }, + jsonOrThrow: (parsed, opts) => { + const raw = schema.json(parsed, opts); + if (raw.ok) { + return raw.value; + } + throw new JsonError(raw.errors); + }, + }; +} + +/** + * schema utils are defined in one file to resolve issues with circular imports + */ + +export function nullable(schema: BaseSchema): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw == null) { + return { + ok: true, + value: null, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (parsed == null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.NULLABLE, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function optional( + schema: BaseSchema, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw == null) { + return { + ok: true, + value: undefined, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (opts?.omitUndefined && parsed === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (parsed == null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.OPTIONAL, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function optionalNullable( + schema: BaseSchema, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (raw === null) { + return { + ok: true, + value: null, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (parsed === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (parsed === null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.OPTIONAL_NULLABLE, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function transform( + schema: BaseSchema, + transformer: SchemaTransformer, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + const parsed = schema.parse(raw, opts); + if (!parsed.ok) { + return parsed; + } + return { + ok: true, + value: transformer.transform(parsed.value), + }; + }, + json: (transformed, opts) => { + const parsed = transformer.untransform(transformed); + return schema.json(parsed, opts); + }, + getType: () => schema.getType(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts new file mode 100644 index 000000000000..efb3b0c46288 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts @@ -0,0 +1,4 @@ +export type { SchemaUtils } from "./getSchemaUtils.js"; +export { getSchemaUtils, optional, transform } from "./getSchemaUtils.js"; +export { JsonError } from "./JsonError.js"; +export { ParseError } from "./ParseError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts new file mode 100644 index 000000000000..d36a4900c6e6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts @@ -0,0 +1,8 @@ +import type { ValidationError } from "../../Schema.js"; + +export function stringifyValidationError(error: ValidationError): string { + if (error.path.length === 0) { + return error.message; + } + return `${error.path.join(" -> ")}: ${error.message}`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts new file mode 100644 index 000000000000..c72be55e9406 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts @@ -0,0 +1 @@ +export { set } from "./set.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts new file mode 100644 index 000000000000..2013cdb4760f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts @@ -0,0 +1,43 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { list } from "../list/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function set(schema: Schema): Schema> { + const listSchema = list(schema); + const baseSchema: BaseSchema> = { + parse: (raw, opts) => { + const parsedList = listSchema.parse(raw, opts); + if (parsedList.ok) { + return { + ok: true, + value: new Set(parsedList.value), + }; + } else { + return parsedList; + } + }, + json: (parsed, opts) => { + if (!(parsed instanceof Set)) { + return { + ok: false, + errors: [ + { + path: opts?.breadcrumbsPrefix ?? [], + message: getErrorMessageForIncorrectType(parsed, "Set"), + }, + ], + }; + } + const jsonList = listSchema.json([...parsed], opts); + return jsonList; + }, + getType: () => SchemaType.SET, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts new file mode 100644 index 000000000000..c8318222b4f7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts @@ -0,0 +1,6 @@ +export type { + inferParsedUnidiscriminatedUnionSchema, + inferRawUnidiscriminatedUnionSchema, + UndiscriminatedUnionSchema, +} from "./types.js"; +export { undiscriminatedUnion } from "./undiscriminatedUnion.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts new file mode 100644 index 000000000000..0d5096fab913 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts @@ -0,0 +1,10 @@ +import type { inferParsed, inferRaw, Schema } from "../../Schema.js"; + +export type UndiscriminatedUnionSchema = Schema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema +>; + +export type inferRawUnidiscriminatedUnionSchema = inferRaw; + +export type inferParsedUnidiscriminatedUnionSchema = inferParsed; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts new file mode 100644 index 000000000000..07591b4d3e63 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts @@ -0,0 +1,67 @@ +import { + type BaseSchema, + type MaybeValid, + type Schema, + type SchemaOptions, + SchemaType, + type ValidationError, +} from "../../Schema.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { inferParsedUnidiscriminatedUnionSchema, inferRawUnidiscriminatedUnionSchema } from "./types.js"; + +export function undiscriminatedUnion, ...Schema[]]>( + schemas: Schemas, +): Schema, inferParsedUnidiscriminatedUnionSchema> { + const baseSchema: BaseSchema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema + > = { + parse: (raw, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.parse(raw, opts), + schemas, + opts, + ); + }, + json: (parsed, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.json(parsed, opts), + schemas, + opts, + ); + }, + getType: () => SchemaType.UNDISCRIMINATED_UNION, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformUndiscriminatedUnion( + transform: (schema: Schema, opts: SchemaOptions) => MaybeValid, + schemas: Schema[], + opts: SchemaOptions | undefined, +): MaybeValid { + const errors: ValidationError[] = []; + for (const [index, schema] of schemas.entries()) { + const transformed = transform(schema, { ...opts, skipValidation: false }); + if (transformed.ok) { + return transformed; + } else { + for (const error of transformed.errors) { + errors.push({ + path: error.path, + message: `[Variant ${index}] ${error.message}`, + }); + } + } + } + + return { + ok: false, + errors, + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts new file mode 100644 index 000000000000..73cd62adeba5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts @@ -0,0 +1,14 @@ +export function discriminant( + parsedDiscriminant: ParsedDiscriminant, + rawDiscriminant: RawDiscriminant, +): Discriminant { + return { + parsedDiscriminant, + rawDiscriminant, + }; +} + +export interface Discriminant { + parsedDiscriminant: ParsedDiscriminant; + rawDiscriminant: RawDiscriminant; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts new file mode 100644 index 000000000000..6bc29ba9ed38 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts @@ -0,0 +1,10 @@ +export type { Discriminant } from "./discriminant.js"; +export { discriminant } from "./discriminant.js"; +export type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types.js"; +export { union } from "./union.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts new file mode 100644 index 000000000000..7bfdd636d8d0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts @@ -0,0 +1,26 @@ +import type { inferParsedObject, inferRawObject, ObjectSchema } from "../object/index.js"; +import type { Discriminant } from "./discriminant.js"; + +export type UnionSubtypes = { + [K in DiscriminantValues]: ObjectSchema; +}; + +export type inferRawUnion, U extends UnionSubtypes> = { + [K in keyof U]: Record, K> & inferRawObject; +}[keyof U]; + +export type inferParsedUnion, U extends UnionSubtypes> = { + [K in keyof U]: Record, K> & inferParsedObject; +}[keyof U]; + +export type inferRawDiscriminant> = D extends string + ? D + : D extends Discriminant + ? Raw + : never; + +export type inferParsedDiscriminant> = D extends string + ? D + : D extends Discriminant + ? Parsed + : never; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts new file mode 100644 index 000000000000..509658e0eb3d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts @@ -0,0 +1,176 @@ +import { type BaseSchema, type MaybeValid, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { keys } from "../../utils/keys.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { enum_ } from "../enum/index.js"; +import type { ObjectSchema } from "../object/index.js"; +import { getObjectLikeUtils, type ObjectLikeSchema } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { Discriminant } from "./discriminant.js"; +import type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types.js"; + +export function union, U extends UnionSubtypes>( + discriminant: D, + union: U, +): ObjectLikeSchema, inferParsedUnion> { + const rawDiscriminant = + typeof discriminant === "string" ? discriminant : (discriminant.rawDiscriminant as inferRawDiscriminant); + const parsedDiscriminant = + typeof discriminant === "string" + ? discriminant + : (discriminant.parsedDiscriminant as inferParsedDiscriminant); + + const discriminantValueSchema = enum_(keys(union) as string[]); + + const baseSchema: BaseSchema, inferParsedUnion> = { + parse: (raw, opts) => { + return transformAndValidateUnion({ + value: raw, + discriminant: rawDiscriminant, + transformedDiscriminant: parsedDiscriminant, + transformDiscriminantValue: (discriminantValue) => + discriminantValueSchema.parse(discriminantValue, { + allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawDiscriminant], + }), + getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], + allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, + transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => + additionalPropertiesSchema.parse(additionalProperties, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return transformAndValidateUnion({ + value: parsed, + discriminant: parsedDiscriminant, + transformedDiscriminant: rawDiscriminant, + transformDiscriminantValue: (discriminantValue) => + discriminantValueSchema.json(discriminantValue, { + allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedDiscriminant], + }), + getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], + allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, + transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => + additionalPropertiesSchema.json(additionalProperties, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.UNION, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + }; +} + +function transformAndValidateUnion< + TransformedDiscriminant extends string, + TransformedDiscriminantValue extends string, + TransformedAdditionalProperties, +>({ + value, + discriminant, + transformedDiscriminant, + transformDiscriminantValue, + getAdditionalPropertiesSchema, + allowUnrecognizedUnionMembers = false, + transformAdditionalProperties, + breadcrumbsPrefix = [], +}: { + value: unknown; + discriminant: string; + transformedDiscriminant: TransformedDiscriminant; + transformDiscriminantValue: (discriminantValue: unknown) => MaybeValid; + getAdditionalPropertiesSchema: (discriminantValue: string) => ObjectSchema | undefined; + allowUnrecognizedUnionMembers: boolean | undefined; + transformAdditionalProperties: ( + additionalProperties: unknown, + additionalPropertiesSchema: ObjectSchema, + ) => MaybeValid; + breadcrumbsPrefix: string[] | undefined; +}): MaybeValid & TransformedAdditionalProperties> { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const { [discriminant]: discriminantValue, ...additionalProperties } = value; + + if (discriminantValue == null) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: `Missing discriminant ("${discriminant}")`, + }, + ], + }; + } + + const transformedDiscriminantValue = transformDiscriminantValue(discriminantValue); + if (!transformedDiscriminantValue.ok) { + return { + ok: false, + errors: transformedDiscriminantValue.errors, + }; + } + + const additionalPropertiesSchema = getAdditionalPropertiesSchema(transformedDiscriminantValue.value); + + if (additionalPropertiesSchema == null) { + if (allowUnrecognizedUnionMembers) { + return { + ok: true, + value: { + [transformedDiscriminant]: transformedDiscriminantValue.value, + ...additionalProperties, + } as Record & TransformedAdditionalProperties, + }; + } else { + return { + ok: false, + errors: [ + { + path: [...breadcrumbsPrefix, discriminant], + message: "Unexpected discriminant value", + }, + ], + }; + } + } + + const transformedAdditionalProperties = transformAdditionalProperties( + additionalProperties, + additionalPropertiesSchema, + ); + if (!transformedAdditionalProperties.ok) { + return transformedAdditionalProperties; + } + + return { + ok: true, + value: { + [transformedDiscriminant]: discriminantValue, + ...transformedAdditionalProperties.value, + } as Record & TransformedAdditionalProperties, + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts new file mode 100644 index 000000000000..befac2e3bebc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts @@ -0,0 +1,2 @@ +export * from "./builders/index.js"; +export type { inferParsed, inferRaw, Schema, SchemaOptions } from "./Schema.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts new file mode 100644 index 000000000000..9cd354b3418e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts @@ -0,0 +1 @@ +export type MaybePromise = T | Promise; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts new file mode 100644 index 000000000000..59f9e658867b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts @@ -0,0 +1,9 @@ +export type addQuestionMarksToNullableProperties = { + [K in OptionalKeys]?: T[K]; +} & Pick>; + +export type OptionalKeys = { + [K in keyof T]-?: undefined extends T[K] ? K : never; +}[keyof T]; + +export type RequiredKeys = Exclude>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts new file mode 100644 index 000000000000..9aa4ed5029a0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts @@ -0,0 +1,21 @@ +import { getSchemaUtils } from "../builders/schema-utils/index.js"; +import type { BaseSchema, MaybeValid, Schema, SchemaOptions, SchemaType } from "../Schema.js"; +import { maybeSkipValidation } from "./maybeSkipValidation.js"; + +export function createIdentitySchemaCreator( + schemaType: SchemaType, + validate: (value: unknown, opts?: SchemaOptions) => MaybeValid, +): () => Schema { + return () => { + const baseSchema: BaseSchema = { + parse: validate, + json: validate, + getType: () => schemaType, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts new file mode 100644 index 000000000000..2d5c93d657ce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts @@ -0,0 +1,3 @@ +export function entries(object: T): [keyof T, T[keyof T]][] { + return Object.entries(object) as [keyof T, T[keyof T]][]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts new file mode 100644 index 000000000000..70527d10013b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts @@ -0,0 +1,13 @@ +export function filterObject(obj: T, keysToInclude: K[]): Pick { + const keysToIncludeSet = new Set(keysToInclude); + return Object.entries(obj).reduce( + (acc, [key, value]) => { + if (keysToIncludeSet.has(key as K)) { + acc[key as K] = value as T[K]; + } + return acc; + // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter + }, + {} as Pick, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts new file mode 100644 index 000000000000..1a5c31027ce9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts @@ -0,0 +1,25 @@ +export function getErrorMessageForIncorrectType(value: unknown, expectedType: string): string { + return `Expected ${expectedType}. Received ${getTypeAsString(value)}.`; +} + +function getTypeAsString(value: unknown): string { + if (Array.isArray(value)) { + return "list"; + } + if (value === null) { + return "null"; + } + if (value instanceof BigInt) { + return "BigInt"; + } + switch (typeof value) { + case "string": + return `"${value}"`; + case "bigint": + case "number": + case "boolean": + case "undefined": + return `${value}`; + } + return typeof value; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts new file mode 100644 index 000000000000..db82a722c35b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts @@ -0,0 +1,17 @@ +// borrowed from https://github.com/lodash/lodash/blob/master/isPlainObject.js +export function isPlainObject(value: unknown): value is Record { + if (typeof value !== "object" || value === null) { + return false; + } + + if (Object.getPrototypeOf(value) === null) { + return true; + } + + let proto = value; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + return Object.getPrototypeOf(value) === proto; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts new file mode 100644 index 000000000000..2e0930e2d70b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts @@ -0,0 +1,3 @@ +export function keys(object: T): (keyof T)[] { + return Object.keys(object) as (keyof T)[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts new file mode 100644 index 000000000000..f32d4525136d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts @@ -0,0 +1,38 @@ +import type { BaseSchema, MaybeValid, SchemaOptions } from "../Schema.js"; + +export function maybeSkipValidation, Raw, Parsed>(schema: S): S { + return { + ...schema, + json: transformAndMaybeSkipValidation(schema.json), + parse: transformAndMaybeSkipValidation(schema.parse), + }; +} + +function transformAndMaybeSkipValidation( + transform: (value: unknown, opts?: SchemaOptions) => MaybeValid, +): (value: unknown, opts?: SchemaOptions) => MaybeValid { + return (value, opts): MaybeValid => { + const transformed = transform(value, opts); + const { skipValidation = false } = opts ?? {}; + if (!transformed.ok && skipValidation) { + // biome-ignore lint/suspicious/noConsole: allow console + console.warn( + [ + "Failed to validate.", + ...transformed.errors.map( + (error) => + " - " + + (error.path.length > 0 ? `${error.path.join(".")}: ${error.message}` : error.message), + ), + ].join("\n"), + ); + + return { + ok: true, + value: value as T, + }; + } else { + return transformed; + } + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts new file mode 100644 index 000000000000..f58d6f3d35f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts @@ -0,0 +1,12 @@ +export function partition(items: readonly T[], predicate: (item: T) => boolean): [T[], T[]] { + const trueItems: T[] = [], + falseItems: T[] = []; + for (const item of items) { + if (predicate(item)) { + trueItems.push(item); + } else { + falseItems.push(item); + } + } + return [trueItems, falseItems]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts new file mode 100644 index 000000000000..9f0bdd34e0d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts @@ -0,0 +1,6 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; +export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts new file mode 100644 index 000000000000..e37f244ea60c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts new file mode 100644 index 000000000000..668b72ec3402 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, + string[] +> = core.serialization.list(core.serialization.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, + string[] +> = core.serialization.list(core.serialization.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts new file mode 100644 index 000000000000..242978c11a34 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, + Record +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, + Record +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts new file mode 100644 index 000000000000..9003c1ac3676 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, + Record +> = core.serialization.record(core.serialization.string(), core.serialization.string()); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, + Record +> = core.serialization.record(core.serialization.string(), core.serialization.string()); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts new file mode 100644 index 000000000000..b7e20374f571 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnOptional.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField | undefined +> = ObjectWithRequiredField.optional(); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnOptional.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField | undefined +> = ObjectWithRequiredField.optional(); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts new file mode 100644 index 000000000000..4792425484f1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts new file mode 100644 index 000000000000..53931f5e393e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, + Set +> = core.serialization.set(core.serialization.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, + Set +> = core.serialization.set(core.serialization.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..1972f5b270f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1,7 @@ +export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; +export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; +export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; +export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; +export * as getAndReturnOptional from "./getAndReturnOptional.js"; +export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; +export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..e053119b972c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1,2 @@ +export * as testDelete from "./testDelete.js"; +export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts new file mode 100644 index 000000000000..b6273278aa1f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts new file mode 100644 index 000000000000..a642aa120d8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..cd7e640937da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts @@ -0,0 +1,8 @@ +export * as container from "./container/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts new file mode 100644 index 000000000000..60f40db3f33b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, + SeedExhaustive.types.NestedObjectWithRequiredField[] +> = core.serialization.list(NestedObjectWithRequiredField); + +export declare namespace Request { + export type Raw = NestedObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..d00c4c582910 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts new file mode 100644 index 000000000000..c82dda746e5a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts new file mode 100644 index 000000000000..da8888318c5b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..b30603cae602 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1,4 @@ +export * as getWithInlinePath from "./getWithInlinePath.js"; +export * as getWithPath from "./getWithPath.js"; +export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; +export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts new file mode 100644 index 000000000000..b84b3f790f22 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.params.modifyWithInlinePath.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts new file mode 100644 index 000000000000..8369d9dae207 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts new file mode 100644 index 000000000000..eb7fdb1065fb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, + string +> = core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts new file mode 100644 index 000000000000..f51fb5f9e891 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Request { + export type Raw = boolean; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBool.Response.Raw, + boolean +> = core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts new file mode 100644 index 000000000000..08ac416d1caf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDate.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts new file mode 100644 index 000000000000..a80c46b7f418 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, + Date +> = core.serialization.date(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, + Date +> = core.serialization.date(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts new file mode 100644 index 000000000000..bba9c504ff71 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, + number +> = core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, + number +> = core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts new file mode 100644 index 000000000000..552fe3843ef9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts new file mode 100644 index 000000000000..191eda735e47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnLong.Response.Raw, + number +> = core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts new file mode 100644 index 000000000000..f75bf59ba909 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Request.Raw, + string +> = core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts new file mode 100644 index 000000000000..64875010a017 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..9805ab86b129 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1,9 @@ +export * as getAndReturnBase64 from "./getAndReturnBase64.js"; +export * as getAndReturnBool from "./getAndReturnBool.js"; +export * as getAndReturnDate from "./getAndReturnDate.js"; +export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; +export * as getAndReturnDouble from "./getAndReturnDouble.js"; +export * as getAndReturnInt from "./getAndReturnInt.js"; +export * as getAndReturnLong from "./getAndReturnLong.js"; +export * as getAndReturnString from "./getAndReturnString.js"; +export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..47e249372cff --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCategory: core.serialization.Schema< + serializers.endpoints.ErrorCategory.Raw, + SeedExhaustive.endpoints.ErrorCategory +> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); + +export declare namespace ErrorCategory { + export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..a36b10d4b362 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCode: core.serialization.Schema< + serializers.endpoints.ErrorCode.Raw, + SeedExhaustive.endpoints.ErrorCode +> = core.serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); + +export declare namespace ErrorCode { + export type Raw = + | "INTERNAL_SERVER_ERROR" + | "UNAUTHORIZED" + | "FORBIDDEN" + | "BAD_REQUEST" + | "CONFLICT" + | "GONE" + | "UNPROCESSABLE_ENTITY" + | "NOT_IMPLEMENTED" + | "BAD_GATEWAY" + | "SERVICE_UNAVAILABLE" + | "Unknown"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..59ab664d43a2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ErrorCategory } from "./ErrorCategory.js"; +import { ErrorCode } from "./ErrorCode.js"; + +export const Error_: core.serialization.ObjectSchema< + serializers.endpoints.Error_.Raw, + SeedExhaustive.endpoints.Error_ +> = core.serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: core.serialization.string().optional(), + field: core.serialization.string().optional(), +}); + +export declare namespace Error_ { + export interface Raw { + category: ErrorCategory.Raw; + code: ErrorCode.Raw; + detail?: string | null; + field?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..17af0986c151 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Error_ } from "./Error_.js"; + +export const PutResponse: core.serialization.ObjectSchema< + serializers.endpoints.PutResponse.Raw, + SeedExhaustive.endpoints.PutResponse +> = core.serialization.object({ + errors: core.serialization.list(Error_).optional(), +}); + +export declare namespace PutResponse { + export interface Raw { + errors?: Error_.Raw[] | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..66e101cdc2d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1,4 @@ +export * as noEndingSlash from "./noEndingSlash.js"; +export * as withEndingSlash from "./withEndingSlash.js"; +export * as withMixedCase from "./withMixedCase.js"; +export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts new file mode 100644 index 000000000000..2b0a2cfbfa53 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts new file mode 100644 index 000000000000..de39ec7a2a0d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts new file mode 100644 index 000000000000..ffedf860047a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts new file mode 100644 index 000000000000..8d308fd3e42f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..5d81697cccfb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../api/index.js"; +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const BadObjectRequestInfo: core.serialization.ObjectSchema< + serializers.BadObjectRequestInfo.Raw, + SeedExhaustive.BadObjectRequestInfo +> = core.serialization.object({ + message: core.serialization.string(), +}); + +export declare namespace BadObjectRequestInfo { + export interface Raw { + message: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts new file mode 100644 index 000000000000..20b614a89e2f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts @@ -0,0 +1,9 @@ +export * as endpoints from "./endpoints/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..d8c20c33277a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,23 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../api/index.js"; +import * as core from "../../../../../core/index.js"; +import type * as serializers from "../../../../index.js"; +import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; + +export const PostWithObjectBody: core.serialization.Schema< + serializers.PostWithObjectBody.Raw, + SeedExhaustive.PostWithObjectBody +> = core.serialization.object({ + string: core.serialization.string(), + integer: core.serialization.number(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +}); + +export declare namespace PostWithObjectBody { + export interface Raw { + string: string; + integer: number; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..d62a81ce61fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..549edcdba7f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts new file mode 100644 index 000000000000..8e7617816edf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..b62616349ec6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts new file mode 100644 index 000000000000..c0cba3668202 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts new file mode 100644 index 000000000000..70ac5077c6f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..fb7f25afb170 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ab35ed9023bd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithDocs: core.serialization.ObjectSchema< + serializers.types.ObjectWithDocs.Raw, + SeedExhaustive.types.ObjectWithDocs +> = core.serialization.object({ + string: core.serialization.string(), +}); + +export declare namespace ObjectWithDocs { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..96a37eda2a46 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const WeatherReport: core.serialization.Schema< + serializers.types.WeatherReport.Raw, + SeedExhaustive.types.WeatherReport +> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); + +export declare namespace WeatherReport { + export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts new file mode 100644 index 000000000000..52175f3cee16 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts @@ -0,0 +1,8 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..e8e0fd387243 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { OptionalAlias } from "./OptionalAlias.js"; + +export const DoubleOptional: core.serialization.ObjectSchema< + serializers.types.DoubleOptional.Raw, + SeedExhaustive.types.DoubleOptional +> = core.serialization.object({ + optionalAlias: OptionalAlias.optional(), +}); + +export declare namespace DoubleOptional { + export interface Raw { + optionalAlias?: (OptionalAlias.Raw | undefined) | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..c754d9aba654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< + serializers.types.NestedObjectWithOptionalField.Raw, + SeedExhaustive.types.NestedObjectWithOptionalField +> = core.serialization.object({ + string: core.serialization.string().optional(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), +}); + +export declare namespace NestedObjectWithOptionalField { + export interface Raw { + string?: string | null; + NestedObject?: ObjectWithOptionalField.Raw | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..cd443843bf86 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< + serializers.types.NestedObjectWithRequiredField.Raw, + SeedExhaustive.types.NestedObjectWithRequiredField +> = core.serialization.object({ + string: core.serialization.string(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +}); + +export declare namespace NestedObjectWithRequiredField { + export interface Raw { + string: string; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..c7426a9b9847 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithMapOfMap: core.serialization.ObjectSchema< + serializers.types.ObjectWithMapOfMap.Raw, + SeedExhaustive.types.ObjectWithMapOfMap +> = core.serialization.object({ + map: core.serialization.record( + core.serialization.string(), + core.serialization.record(core.serialization.string(), core.serialization.string()), + ), +}); + +export declare namespace ObjectWithMapOfMap { + export interface Raw { + map: Record>; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..44a200707fd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,42 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithOptionalField: core.serialization.ObjectSchema< + serializers.types.ObjectWithOptionalField.Raw, + SeedExhaustive.types.ObjectWithOptionalField +> = core.serialization.object({ + string: core.serialization.string().optional(), + integer: core.serialization.number().optional(), + long: core.serialization.number().optional(), + double: core.serialization.number().optional(), + bool: core.serialization.boolean().optional(), + datetime: core.serialization.date().optional(), + date: core.serialization.string().optional(), + uuid: core.serialization.string().optional(), + base64: core.serialization.string().optional(), + list: core.serialization.list(core.serialization.string()).optional(), + set: core.serialization.set(core.serialization.string()).optional(), + map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), + bigint: core.serialization.string().optional(), +}); + +export declare namespace ObjectWithOptionalField { + export interface Raw { + string?: string | null; + integer?: number | null; + long?: number | null; + double?: number | null; + bool?: boolean | null; + datetime?: string | null; + date?: string | null; + uuid?: string | null; + base64?: string | null; + list?: string[] | null; + set?: string[] | null; + map?: Record | null; + bigint?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..b6887e41337d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithRequiredField: core.serialization.ObjectSchema< + serializers.types.ObjectWithRequiredField.Raw, + SeedExhaustive.types.ObjectWithRequiredField +> = core.serialization.object({ + string: core.serialization.string(), +}); + +export declare namespace ObjectWithRequiredField { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..a7798d5904bf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const OptionalAlias: core.serialization.Schema< + serializers.types.OptionalAlias.Raw, + SeedExhaustive.types.OptionalAlias +> = core.serialization.string().optional(); + +export declare namespace OptionalAlias { + export type Raw = string | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..83b27d0bb69d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,30 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Cat } from "./Cat.js"; +import { Dog } from "./Dog.js"; + +export const Animal: core.serialization.Schema = + core.serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); + +export declare namespace Animal { + export type Raw = Animal.Dog | Animal.Cat; + + export interface Dog extends Dog.Raw { + animal: "dog"; + } + + export interface Cat extends Cat.Raw { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..16f8a2006e5c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Cat: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToMeow: core.serialization.boolean(), + }); + +export declare namespace Cat { + export interface Raw { + name: string; + likesToMeow: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..271a1f3a4afa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Dog: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToWoof: core.serialization.boolean(), + }); + +export declare namespace Dog { + export interface Raw { + name: string; + likesToWoof: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts new file mode 100644 index 000000000000..498f143c7283 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts @@ -0,0 +1,46 @@ +import { bigint } from "../../../../src/core/schemas/builders/bigint"; +import { itJson, itParse, itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("bigint", () => { + itSchema("converts between raw bigint and parsed bigint", bigint(), { + raw: BigInt("9007199254740992"), + parsed: BigInt("9007199254740992"), + }); + + itParse("converts between raw number and parsed bigint", bigint(), { + raw: 10, + parsed: BigInt("10"), + }); + + itParse("converts between raw number and parsed bigint", bigint(), { + raw: BigInt("10"), + parsed: BigInt("10"), + }); + + itJson("converts raw bigint to parsed bigint", bigint(), { + parsed: BigInt("10"), + raw: BigInt("10"), + }); + + itValidateParse("string", bigint(), "42", [ + { + message: 'Expected bigint | number. Received "42".', + path: [], + }, + ]); + + itValidateJson("number", bigint(), 42, [ + { + message: "Expected bigint. Received 42.", + path: [], + }, + ]); + + itValidateJson("string", bigint(), "42", [ + { + message: 'Expected bigint. Received "42".', + path: [], + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts new file mode 100644 index 000000000000..2790268a09c6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts @@ -0,0 +1,31 @@ +import { date } from "../../../../src/core/schemas/builders/date"; +import { itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("date", () => { + itSchema("converts between raw ISO string and parsed Date", date(), { + raw: "2022-09-29T05:41:21.939Z", + parsed: new Date("2022-09-29T05:41:21.939Z"), + }); + + itValidateParse("non-string", date(), 42, [ + { + message: "Expected string. Received 42.", + path: [], + }, + ]); + + itValidateParse("non-ISO", date(), "hello world", [ + { + message: 'Expected ISO 8601 date string. Received "hello world".', + path: [], + }, + ]); + + itValidateJson("non-Date", date(), "hello", [ + { + message: 'Expected Date object. Received "hello".', + path: [], + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts new file mode 100644 index 000000000000..d1707325b29b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts @@ -0,0 +1,30 @@ +import { enum_ } from "../../../../src/core/schemas/builders/enum"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("enum", () => { + itSchemaIdentity(enum_(["A", "B", "C"]), "A"); + + itSchemaIdentity(enum_(["A", "B", "C"]), "D" as any, { + opts: { allowUnrecognizedEnumValues: true }, + }); + + itValidate("invalid enum", enum_(["A", "B", "C"]), "D", [ + { + message: 'Expected enum. Received "D".', + path: [], + }, + ]); + + itValidate( + "non-string", + enum_(["A", "B", "C"]), + [], + [ + { + message: "Expected string. Received list.", + path: [], + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts new file mode 100644 index 000000000000..a82ace4a08c0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts @@ -0,0 +1,57 @@ +import { lazy, list, object, string } from "../../../../src/core/schemas/builders"; +import type { Schema } from "../../../../src/core/schemas/Schema"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("lazy", () => { + it("doesn't run immediately", () => { + let wasRun = false; + lazy(() => { + wasRun = true; + return string(); + }); + expect(wasRun).toBe(false); + }); + + it("only runs first time", async () => { + let count = 0; + const schema = lazy(() => { + count++; + return string(); + }); + await schema.parse("hello"); + await schema.json("world"); + expect(count).toBe(1); + }); + + itSchemaIdentity( + lazy(() => object({})), + { foo: "hello" }, + { + title: "passes opts through", + opts: { unrecognizedObjectKeys: "passthrough" }, + }, + ); + + itSchemaIdentity( + lazy(() => object({ foo: string() })), + { foo: "hello" }, + ); + + // eslint-disable-next-line vi/expect-expect + it("self-referencial schema doesn't compile", () => { + () => { + // @ts-expect-error + const a = lazy(() => object({ foo: a })); + }; + }); + + // eslint-disable-next-line vi/expect-expect + it("self-referencial compiles with explicit type", () => { + () => { + interface TreeNode { + children: TreeNode[]; + } + const TreeNode: Schema = lazy(() => object({ children: list(TreeNode) })); + }; + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts new file mode 100644 index 000000000000..9b443671a71f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts @@ -0,0 +1,18 @@ +import { lazyObject, number, object, string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("lazy", () => { + itSchemaIdentity( + lazyObject(() => object({ foo: string() })), + { foo: "hello" }, + ); + + itSchemaIdentity( + lazyObject(() => object({ foo: string() })).extend(object({ bar: number() })), + { + foo: "hello", + bar: 42, + }, + { title: "returned schema has object utils" }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts new file mode 100644 index 000000000000..8b7d5e40cfaf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts @@ -0,0 +1,7 @@ +import { object } from "../../../../../src/core/schemas/builders/object"; +import { schemaB } from "./b"; + +// @ts-expect-error +export const schemaA = object({ + b: schemaB, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts new file mode 100644 index 000000000000..fb219d54c8e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts @@ -0,0 +1,8 @@ +import { object } from "../../../../../src/core/schemas/builders/object"; +import { optional } from "../../../../../src/core/schemas/builders/schema-utils"; +import { schemaA } from "./a"; + +// @ts-expect-error +export const schemaB = object({ + a: optional(schemaA), +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts new file mode 100644 index 000000000000..108789b7317d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts @@ -0,0 +1,41 @@ +import { list, object, property, string } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("list", () => { + itSchemaIdentity(list(string()), ["hello", "world"], { + title: "functions as identity when item type is primitive", + }); + + itSchema( + "converts objects correctly", + list( + object({ + helloWorld: property("hello_world", string()), + }), + ), + { + raw: [{ hello_world: "123" }], + parsed: [{ helloWorld: "123" }], + }, + ); + + itValidate("not a list", list(string()), 42, [ + { + path: [], + message: "Expected list. Received 42.", + }, + ]); + + itValidate( + "invalid item type", + list(string()), + [42], + [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts new file mode 100644 index 000000000000..fa6c88873c61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts @@ -0,0 +1,21 @@ +import { stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("stringLiteral", () => { + itSchemaIdentity(stringLiteral("A"), "A"); + + itValidate("incorrect string", stringLiteral("A"), "B", [ + { + path: [], + message: 'Expected "A". Received "B".', + }, + ]); + + itValidate("non-string", stringLiteral("A"), 42, [ + { + path: [], + message: 'Expected "A". Received 42.', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts new file mode 100644 index 000000000000..b18bc9d3e5df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts @@ -0,0 +1,57 @@ +import { object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; + +describe("withParsedProperties", () => { + it("Added properties included on parsed object", async () => { + const schema = object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }).withParsedProperties({ + printFoo: (parsed) => () => parsed.foo, + printHelloWorld: () => () => "Hello world", + helloWorld: "Hello world", + }); + + const parsed = await schema.parse({ raw_foo: "value of foo", bar: "bar" }); + if (!parsed.ok) { + throw new Error("Failed to parse"); + } + expect(parsed.value.printFoo()).toBe("value of foo"); + expect(parsed.value.printHelloWorld()).toBe("Hello world"); + expect(parsed.value.helloWorld).toBe("Hello world"); + }); + + it("Added property is removed on raw object", async () => { + const schema = object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }).withParsedProperties({ + printFoo: (parsed) => () => parsed.foo, + }); + + const original = { raw_foo: "value of foo", bar: "bar" } as const; + const parsed = await schema.parse(original); + if (!parsed.ok) { + throw new Error("Failed to parse()"); + } + + const raw = await schema.json(parsed.value); + + if (!raw.ok) { + throw new Error("Failed to json()"); + } + + expect(raw.value).toEqual(original); + }); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with non-object schema", () => { + () => + object({ + foo: string(), + }) + // @ts-expect-error + .withParsedProperties(42); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts new file mode 100644 index 000000000000..b6c2920f4d3e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts @@ -0,0 +1,89 @@ +import { boolean, object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; + +describe("extend", () => { + itSchemaIdentity( + object({ + foo: string(), + }).extend( + object({ + bar: stringLiteral("bar"), + }), + ), + { + foo: "", + bar: "bar", + } as const, + { + title: "extended properties are included in schema", + }, + ); + + itSchemaIdentity( + object({ + foo: string(), + }) + .extend( + object({ + bar: stringLiteral("bar"), + }), + ) + .extend( + object({ + baz: boolean(), + }), + ), + { + foo: "", + bar: "bar", + baz: true, + } as const, + { + title: "extensions can be extended", + }, + ); + + itSchema( + "converts nested object", + object({ + item: object({ + helloWorld: property("hello_world", string()), + }), + }).extend( + object({ + goodbye: property("goodbye_raw", string()), + }), + ), + { + raw: { item: { hello_world: "yo" }, goodbye_raw: "peace" }, + parsed: { item: { helloWorld: "yo" }, goodbye: "peace" }, + }, + ); + + itSchema( + "extensions work with raw/parsed property name conversions", + object({ + item: property("item_raw", string()), + }).extend( + object({ + goodbye: property("goodbye_raw", string()), + }), + ), + { + raw: { item_raw: "hi", goodbye_raw: "peace" }, + parsed: { item: "hi", goodbye: "peace" }, + }, + ); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with non-object schema", () => { + () => + object({ + foo: string(), + }) + // @ts-expect-error + .extend([]); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts new file mode 100644 index 000000000000..a8d9fe0a1359 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts @@ -0,0 +1,255 @@ +import { any, number, object, property, string, stringLiteral, unknown } from "../../../../src/core/schemas/builders"; +import { itJson, itParse, itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("object", () => { + itSchemaIdentity( + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { + foo: "", + bar: "bar", + }, + { + title: "functions as identity when values are primitives and property() isn't used", + }, + ); + + itSchema( + "uses raw key from property()", + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { raw_foo: "foo", bar: "bar" }, + parsed: { foo: "foo", bar: "bar" }, + }, + ); + + itSchema( + "keys with unknown type can be omitted", + object({ + foo: unknown(), + }), + { + raw: {}, + parsed: {}, + }, + ); + + itSchema( + "keys with any type can be omitted", + object({ + foo: any(), + }), + { + raw: {}, + parsed: {}, + }, + ); + + describe("unrecognizedObjectKeys", () => { + describe("parse", () => { + itParse( + 'includes unknown values when unrecognizedObjectKeys === "passthrough"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "passthrough", + }, + }, + ); + + itParse( + 'strips unknown values when unrecognizedObjectKeys === "strip"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + }, + opts: { + unrecognizedObjectKeys: "strip", + }, + }, + ); + }); + + describe("json", () => { + itJson( + 'includes unknown values when unrecognizedObjectKeys === "passthrough"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "passthrough", + }, + }, + ); + + itJson( + 'strips unknown values when unrecognizedObjectKeys === "strip"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "strip", + }, + }, + ); + }); + }); + + describe("nullish properties", () => { + itSchema("missing properties are not added", object({ foo: property("raw_foo", string().optional()) }), { + raw: {}, + parsed: {}, + }); + + itSchema("undefined properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }); + + itSchema("null properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }); + + describe("extensions", () => { + itSchema( + "undefined properties are not dropped", + object({}).extend(object({ foo: property("raw_foo", string().optional()) })), + { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }, + ); + + describe("parse()", () => { + itParse( + "null properties are not dropped", + object({}).extend(object({ foo: property("raw_foo", string().optional()) })), + { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }, + ); + }); + }); + }); + + itValidate( + "missing property", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { foo: "hello" }, + [ + { + path: [], + message: 'Missing required key "bar"', + }, + ], + ); + + itValidate( + "extra property", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { foo: "hello", bar: "bar", baz: 42 }, + [ + { + path: ["baz"], + message: 'Unexpected key "baz"', + }, + ], + ); + + itValidate( + "not an object", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate( + "nested validation error", + object({ + foo: object({ + bar: number(), + }), + }), + { foo: { bar: "hello" } }, + [ + { + path: ["foo", "bar"], + message: 'Expected number. Received "hello".', + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts new file mode 100644 index 000000000000..efcd83afae79 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts @@ -0,0 +1,21 @@ +import { objectWithoutOptionalProperties, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; + +describe("objectWithoutOptionalProperties", () => { + itSchema( + "all properties are required", + objectWithoutOptionalProperties({ + foo: string(), + bar: stringLiteral("bar").optional(), + }), + { + raw: { + foo: "hello", + }, + // @ts-expect-error + parsed: { + foo: "hello", + }, + }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts new file mode 100644 index 000000000000..c8770fca17dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts @@ -0,0 +1,87 @@ +import { object, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itJson, itParse, itSchema } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("passthrough", () => { + const baseSchema = object({ + foo: string(), + bar: stringLiteral("bar"), + }); + + describe("parse", () => { + itParse("includes unknown values", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + baz: "extra", + }, + parsed: { + foo: "hello", + bar: "bar", + baz: "extra", + }, + }); + + itValidate( + "preserves schema validation", + baseSchema.passthrough(), + { + foo: 123, + bar: "bar", + baz: "extra", + }, + [ + { + path: ["foo"], + message: "Expected string. Received 123.", + }, + ], + ); + }); + + describe("json", () => { + itJson("includes unknown values", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + + baz: "extra", + }, + parsed: { + foo: "hello", + bar: "bar", + + baz: "extra", + }, + }); + + itValidate( + "preserves schema validation", + baseSchema.passthrough(), + { + foo: "hello", + bar: "wrong", + baz: "extra", + }, + [ + { + path: ["bar"], + message: 'Expected "bar". Received "wrong".', + }, + ], + ); + }); + + itSchema("preserves schema validation in both directions", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + extra: 42, + }, + parsed: { + foo: "hello", + bar: "bar", + extra: 42, + }, + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts new file mode 100644 index 000000000000..1adbbe2a8380 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts @@ -0,0 +1,6 @@ +import { any } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("any", () => { + itSchemaIdentity(any(), true); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts new file mode 100644 index 000000000000..897a8295dca7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts @@ -0,0 +1,14 @@ +import { boolean } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("boolean", () => { + itSchemaIdentity(boolean(), true); + + itValidate("non-boolean", boolean(), {}, [ + { + path: [], + message: "Expected boolean. Received object.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts new file mode 100644 index 000000000000..1d18eba052ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts @@ -0,0 +1,54 @@ +import { never } from "../../../../src/core/schemas/builders"; + +describe("never", () => { + it("always fails to parse", () => { + const schema = never(); + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("always fails to json", () => { + const schema = never(); + const result = schema.json("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("fails with any value including undefined", () => { + const schema = never(); + expect(schema.parse(undefined).ok).toBe(false); + expect(schema.parse(null).ok).toBe(false); + expect(schema.parse(0).ok).toBe(false); + expect(schema.parse("").ok).toBe(false); + expect(schema.parse({}).ok).toBe(false); + expect(schema.parse([]).ok).toBe(false); + }); + + it("works when called without options parameter", () => { + const schema = never(); + // This tests that the default = {} parameter works correctly + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + expect(result.errors[0]?.path).toEqual([]); + } + }); + + it("succeeds with skipValidation", () => { + const schema = never(); + const result = schema.parse("test", { skipValidation: true }); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.value).toBe("test"); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts new file mode 100644 index 000000000000..2d01415a60ba --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts @@ -0,0 +1,14 @@ +import { number } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("number", () => { + itSchemaIdentity(number(), 42); + + itValidate("non-number", number(), "hello", [ + { + path: [], + message: 'Expected number. Received "hello".', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts new file mode 100644 index 000000000000..57b2368784ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts @@ -0,0 +1,14 @@ +import { string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("string", () => { + itSchemaIdentity(string(), "hello"); + + itValidate("non-string", string(), 42, [ + { + path: [], + message: "Expected string. Received 42.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts new file mode 100644 index 000000000000..4d17a7dbd005 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts @@ -0,0 +1,6 @@ +import { unknown } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("unknown", () => { + itSchemaIdentity(unknown(), true); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts new file mode 100644 index 000000000000..e07f3e7cb00d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts @@ -0,0 +1,34 @@ +import { number, record, string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("record", () => { + itSchemaIdentity(record(string(), string()), { hello: "world" }); + itSchemaIdentity(record(number(), string()), { 42: "world" }); + + itValidate( + "non-record", + record(number(), string()), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate("invalid key type", record(number(), string()), { hello: "world" }, [ + { + path: ["hello (key)"], + message: 'Expected number. Received "hello".', + }, + ]); + + itValidate("invalid value type", record(string(), number()), { hello: "world" }, [ + { + path: ["hello"], + message: 'Expected number. Received "world".', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts new file mode 100644 index 000000000000..822c3ca4e5a4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts @@ -0,0 +1,83 @@ +import { object, string } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; + +describe("getSchemaUtils", () => { + describe("optional()", () => { + itSchema("optional fields allow original schema", string().optional(), { + raw: "hello", + parsed: "hello", + }); + + itSchema("optional fields are not required", string().optional(), { + raw: null, + parsed: undefined, + }); + }); + + describe("transform()", () => { + itSchema( + "transform and untransform run correctly", + string().transform({ + transform: (x) => `${x}X`, + untransform: (x) => (x as string).slice(0, -1), + }), + { + raw: "hello", + parsed: "helloX", + }, + ); + }); + + describe("parseOrThrow()", () => { + it("parses valid value", async () => { + const value = string().parseOrThrow("hello"); + expect(value).toBe("hello"); + }); + + it("throws on invalid value", async () => { + const value = () => object({ a: string(), b: string() }).parseOrThrow({ a: 24 }); + expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); + }); + }); + + describe("jsonOrThrow()", () => { + it("serializes valid value", async () => { + const value = string().jsonOrThrow("hello"); + expect(value).toBe("hello"); + }); + + it("throws on invalid value", async () => { + const value = () => object({ a: string(), b: string() }).jsonOrThrow({ a: 24 }); + expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); + }); + }); + + describe("omitUndefined", () => { + it("serializes undefined as null", async () => { + const value = object({ + a: string().optional(), + b: string().optional(), + }).jsonOrThrow({ + a: "hello", + b: undefined, + }); + expect(value).toEqual({ a: "hello", b: null }); + }); + + it("omits undefined values", async () => { + const value = object({ + a: string().optional(), + b: string().optional(), + }).jsonOrThrow( + { + a: "hello", + b: undefined, + }, + { + omitUndefined: true, + }, + ); + expect(value).toEqual({ a: "hello" }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts new file mode 100644 index 000000000000..13842ff40157 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts @@ -0,0 +1,78 @@ +import { + boolean, + discriminant, + list, + number, + object, + string, + stringLiteral, + union, +} from "../../../src/core/schemas/builders"; +import { booleanLiteral } from "../../../src/core/schemas/builders/literals/booleanLiteral"; +import { property } from "../../../src/core/schemas/builders/object/property"; +import { itSchema } from "./utils/itSchema"; + +describe("Schema", () => { + itSchema( + "large nested object", + object({ + a: string(), + b: stringLiteral("b value"), + c: property( + "raw_c", + list( + object({ + animal: union(discriminant("type", "_type"), { + dog: object({ value: boolean() }), + cat: object({ value: property("raw_cat", number()) }), + }), + }), + ), + ), + d: property("raw_d", boolean()), + e: booleanLiteral(true), + }), + { + raw: { + a: "hello", + b: "b value", + raw_c: [ + { + animal: { + _type: "dog", + value: true, + }, + }, + { + animal: { + _type: "cat", + raw_cat: 42, + }, + }, + ], + raw_d: false, + e: true, + }, + parsed: { + a: "hello", + b: "b value", + c: [ + { + animal: { + type: "dog", + value: true, + }, + }, + { + animal: { + type: "cat", + value: 42, + }, + }, + ], + d: false, + e: true, + }, + }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts new file mode 100644 index 000000000000..53a1652c8bbb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts @@ -0,0 +1,48 @@ +import { set, string } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("set", () => { + itSchema("converts between raw list and parsed Set", set(string()), { + raw: ["A", "B"], + parsed: new Set(["A", "B"]), + }); + + itValidateParse("not a list", set(string()), 42, [ + { + path: [], + message: "Expected list. Received 42.", + }, + ]); + + itValidateJson( + "not a Set", + set(string()), + [], + [ + { + path: [], + message: "Expected Set. Received list.", + }, + ], + ); + + itValidateParse( + "invalid item type", + set(string()), + [42], + [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ], + ); + + itValidateJson("invalid item type", set(string()), new Set([42]), [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts new file mode 100644 index 000000000000..3283555949ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts @@ -0,0 +1,44 @@ +/* eslint-disable no-console */ +import { boolean, number, object, property, string, undiscriminatedUnion } from "../../../src/core/schemas/builders"; + +describe("skipValidation", () => { + it("allows data that doesn't conform to the schema", async () => { + const warningLogs: string[] = []; + const originalConsoleWarn = console.warn; + console.warn = (...args) => warningLogs.push(args.join(" ")); + + const schema = object({ + camelCase: property("snake_case", string()), + numberProperty: number(), + requiredProperty: boolean(), + anyPrimitive: undiscriminatedUnion([string(), number(), boolean()]), + }); + + const parsed = await schema.parse( + { + snake_case: "hello", + numberProperty: "oops", + anyPrimitive: true, + }, + { + skipValidation: true, + }, + ); + + expect(parsed).toEqual({ + ok: true, + value: { + camelCase: "hello", + numberProperty: "oops", + anyPrimitive: true, + }, + }); + + expect(warningLogs).toEqual([ + `Failed to validate. + - numberProperty: Expected number. Received "oops".`, + ]); + + console.warn = originalConsoleWarn; + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts new file mode 100644 index 000000000000..01dcadbba37b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts @@ -0,0 +1,44 @@ +import { number, object, property, string, undiscriminatedUnion } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; + +describe("undiscriminatedUnion", () => { + itSchemaIdentity(undiscriminatedUnion([string(), number()]), "hello world"); + + itSchemaIdentity(undiscriminatedUnion([object({ hello: string() }), object({ goodbye: string() })]), { + goodbye: "foo", + }); + + itSchema( + "Correctly transforms", + undiscriminatedUnion([object({ hello: string() }), object({ helloWorld: property("hello_world", string()) })]), + { + raw: { hello_world: "foo " }, + parsed: { helloWorld: "foo " }, + }, + ); + + it("Returns errors for all variants", async () => { + const result = await undiscriminatedUnion([string(), number()]).parse(true); + if (result.ok) { + throw new Error("Unexpectedly passed validation"); + } + expect(result.errors).toEqual([ + { + message: "[Variant 0] Expected string. Received true.", + path: [], + }, + { + message: "[Variant 1] Expected number. Received true.", + path: [], + }, + ]); + }); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with zero members", () => { + // @ts-expect-error + () => undiscriminatedUnion([]); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts new file mode 100644 index 000000000000..1f5d7a8fad5c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts @@ -0,0 +1,113 @@ +import { boolean, discriminant, number, object, string, union } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("union", () => { + itSchemaIdentity( + union("type", { + lion: object({ + meows: boolean(), + }), + giraffe: object({ + heightInInches: number(), + }), + }), + { type: "lion", meows: true }, + { title: "doesn't transform discriminant when it's a string" }, + ); + + itSchema( + "transforms discriminant when it's a discriminant()", + union(discriminant("type", "_type"), { + lion: object({ meows: boolean() }), + giraffe: object({ heightInInches: number() }), + }), + { + raw: { _type: "lion", meows: true }, + parsed: { type: "lion", meows: true }, + }, + ); + + describe("allowUnrecognizedUnionMembers", () => { + itSchema( + "transforms discriminant & passes through values when discriminant value is unrecognized", + union(discriminant("type", "_type"), { + lion: object({ meows: boolean() }), + giraffe: object({ heightInInches: number() }), + }), + { + // @ts-expect-error + raw: { _type: "moose", isAMoose: true }, + // @ts-expect-error + parsed: { type: "moose", isAMoose: true }, + opts: { + allowUnrecognizedUnionMembers: true, + }, + }, + ); + }); + + describe("withParsedProperties", () => { + it("Added property is included on parsed object", async () => { + const schema = union("type", { + lion: object({}), + tiger: object({ value: string() }), + }).withParsedProperties({ + printType: (parsed) => () => parsed.type, + }); + + const parsed = await schema.parse({ type: "lion" }); + if (!parsed.ok) { + throw new Error("Failed to parse"); + } + expect(parsed.value.printType()).toBe("lion"); + }); + }); + + itValidate( + "non-object", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate( + "missing discriminant", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + {}, + [ + { + path: [], + message: 'Missing discriminant ("type")', + }, + ], + ); + + itValidate( + "unrecognized discriminant value", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + { + type: "bear", + }, + [ + { + path: ["type"], + message: 'Expected enum. Received "bear".', + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts new file mode 100644 index 000000000000..25b13e643207 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts @@ -0,0 +1,78 @@ +/* eslint-disable vi/no-export */ +import type { Schema, SchemaOptions } from "../../../../src/core/schemas/Schema"; + +export function itSchemaIdentity( + schema: Schema, + value: T, + { title = "functions as identity", opts }: { title?: string; opts?: SchemaOptions } = {}, +): void { + itSchema(title, schema, { raw: value, parsed: value, opts }); +} + +export function itSchema( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + only = false, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + only?: boolean; + }, +): void { + // eslint-disable-next-line vi/valid-title + (only ? describe.only : describe)(title, () => { + itParse("parse()", schema, { raw, parsed, opts }); + itJson("json()", schema, { raw, parsed, opts }); + }); +} + +export function itParse( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + }, +): void { + // eslint-disable-next-line vi/valid-title + it(title, () => { + const maybeValid = schema.parse(raw, opts); + if (!maybeValid.ok) { + throw new Error(`Failed to parse() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); + } + expect(maybeValid.value).toStrictEqual(parsed); + }); +} + +export function itJson( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + }, +): void { + // eslint-disable-next-line vi/valid-title + it(title, () => { + const maybeValid = schema.json(parsed, opts); + if (!maybeValid.ok) { + throw new Error(`Failed to json() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); + } + expect(maybeValid.value).toStrictEqual(raw); + }); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts new file mode 100644 index 000000000000..60bc56c123cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts @@ -0,0 +1,56 @@ +/* eslint-disable vi/no-export */ +import type { Schema, SchemaOptions, ValidationError } from "../../../../src/core/schemas/Schema"; + +export function itValidate( + title: string, + schema: Schema, + input: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + // eslint-disable-next-line vi/valid-title + describe("parse()", () => { + itValidateParse(title, schema, input, errors, opts); + }); + describe("json()", () => { + itValidateJson(title, schema, input, errors, opts); + }); +} + +export function itValidateParse( + title: string, + schema: Schema, + raw: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + describe("parse", () => { + // eslint-disable-next-line vi/valid-title + it(title, async () => { + const maybeValid = await schema.parse(raw, opts); + if (maybeValid.ok) { + throw new Error("Value passed validation"); + } + expect(maybeValid.errors).toStrictEqual(errors); + }); + }); +} + +export function itValidateJson( + title: string, + schema: Schema, + parsed: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + describe("json", () => { + // eslint-disable-next-line vi/valid-title + it(title, async () => { + const maybeValid = await schema.json(parsed, opts); + if (maybeValid.ok) { + throw new Error("Value passed validation"); + } + expect(maybeValid.errors).toStrictEqual(errors); + }); + }); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..98b9ec0c58b9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + expect(response).toEqual(new Set(["string"])); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..4bc8916f7ce5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..b9e26c032ff9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..685826602e5e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..650fc620bb1d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..61b5a64bce8f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..8f5f6a59a512 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a128d4844ba2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); From 61cbaa4316463e4fa4b8c766a93b33c270715ea2 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 14:20:16 -0500 Subject: [PATCH 31/71] removed vertical line --- .../src/serialization-pipeline/formats/PassthroughFormat.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts index ba3aa338c19d..a22d01e35822 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts @@ -121,4 +121,3 @@ export class PassthroughFormat implements SerializationFormat { return null; // No runtime files needed } } - From 7b1ba097327de9cb6e59f2c8820cc2e5e8025812 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 15:06:27 -0500 Subject: [PATCH 32/71] added zod imports --- .../core-utilities/CoreUtilitiesManager.ts | 7 +- .../formats/ZodFormat.ts | 70 ++++++++++++------- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts index b643b7f44e26..eeb2059eced2 100644 --- a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts +++ b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts @@ -102,7 +102,7 @@ export class CoreUtilitiesManager { }); // Create the serialization format based on configuration - const serializationFormat = this.createSerializationFormat(getReferenceToExport); + const serializationFormat = this.createSerializationFormat(getReferenceToExport, importsManager); return { zurg: serializationFormat, @@ -146,7 +146,8 @@ export class CoreUtilitiesManager { getReferenceToExport: (args: { manifest: CoreUtility.Manifest; exportedName: string; - }) => ReturnType + }) => ReturnType, + importsManager: ImportsManager ) { const config = { getReferenceToExport, @@ -160,7 +161,7 @@ export class CoreUtilitiesManager { return new ZurgFormat(config); case "zod": - return new ZodFormat(config); + return new ZodFormat(config, importsManager); case "none": return new PassthroughFormat(config); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 84edda0a55b3..314943d73e56 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -1,5 +1,6 @@ import { ts } from "ts-morph"; +import { ImportsManager } from "../../imports-manager"; import { AdditionalProperty, ObjectLikeSchema, @@ -30,7 +31,7 @@ interface ZodBaseSchema extends Schema { /** * Helper to create a property access expression like `z.string()` */ -function zodCall(methodName: string, args: ts.Expression[] = []): ts.Expression { +function createZodCall(methodName: string, args: ts.Expression[] = []): ts.Expression { return ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier("z"), @@ -59,8 +60,29 @@ function chainMethod(expr: ts.Expression, methodName: string, args: ts.Expressio export class ZodFormat implements SerializationFormat { public readonly name = "zod" as const; - constructor(_config: SerializationFormatConfig) { - // No special configuration needed - Zod is an npm dependency + private importsManager?: ImportsManager; + private hasAddedZodImport = false; + + constructor(_config: SerializationFormatConfig, importsManager?: ImportsManager) { + this.importsManager = importsManager; + } + + /** + * Ensure the zod import is added to the current file + */ + private ensureZodImport(): void { + if (!this.hasAddedZodImport && this.importsManager) { + this.importsManager.addImport("zod", { namedImports: ["z"] }); + this.hasAddedZodImport = true; + } + } + + /** + * Create a zod call expression and ensure the import is added + */ + private zodCall(methodName: string, args: ts.Expression[] = []): ts.Expression { + this.ensureZodImport(); + return createZodCall(methodName, args); } // ==================== Schema Utilities ==================== @@ -241,7 +263,7 @@ export class ZodFormat implements SerializationFormat { ); }); - return zodCall("object", [ts.factory.createObjectLiteralExpression(propAssignments, true)]); + return this.zodCall("object", [ts.factory.createObjectLiteralExpression(propAssignments, true)]); } }; @@ -310,19 +332,19 @@ export class ZodFormat implements SerializationFormat { // Create an object schema with the discriminant + non-discriminant properties const discriminantProp = ts.factory.createPropertyAssignment( ts.factory.createStringLiteral(rawDiscriminant), - zodCall("literal", [ts.factory.createStringLiteral(variant.discriminantValue)]) + this.zodCall("literal", [ts.factory.createStringLiteral(variant.discriminantValue)]) ); // Get the properties from the non-discriminant schema // We need to merge them with the discriminant return chainMethod( - zodCall("object", [ts.factory.createObjectLiteralExpression([discriminantProp], false)]), + this.zodCall("object", [ts.factory.createObjectLiteralExpression([discriminantProp], false)]), "merge", [variant.nonDiscriminantProperties.toExpression()] ); }); - return zodCall("discriminatedUnion", [ + return this.zodCall("discriminatedUnion", [ ts.factory.createStringLiteral(rawDiscriminant), ts.factory.createArrayLiteralExpression(variants, true) ]); @@ -377,7 +399,7 @@ export class ZodFormat implements SerializationFormat { isOptional: false, isNullable: false, toExpression: () => { - return zodCall("union", [ + return this.zodCall("union", [ ts.factory.createArrayLiteralExpression( schemas.map((s) => s.toExpression()), false @@ -398,7 +420,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("array", [itemSchema.toExpression()]) + toExpression: () => this.zodCall("array", [itemSchema.toExpression()]) }; return { @@ -412,7 +434,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("set", [itemSchema.toExpression()]) + toExpression: () => this.zodCall("set", [itemSchema.toExpression()]) }; return { @@ -425,7 +447,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("record", [keySchema.toExpression(), valueSchema.toExpression()]) + toExpression: () => this.zodCall("record", [keySchema.toExpression(), valueSchema.toExpression()]) }; return { @@ -441,7 +463,7 @@ export class ZodFormat implements SerializationFormat { isOptional: false, isNullable: false, toExpression: () => - zodCall("enum", [ + this.zodCall("enum", [ ts.factory.createArrayLiteralExpression( values.map((v) => ts.factory.createStringLiteral(v)), false @@ -461,7 +483,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("string") + toExpression: () => this.zodCall("string") }; return { @@ -474,7 +496,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("literal", [ts.factory.createStringLiteral(literal)]) + toExpression: () => this.zodCall("literal", [ts.factory.createStringLiteral(literal)]) }; return { @@ -487,7 +509,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("literal", [literal ? ts.factory.createTrue() : ts.factory.createFalse()]) + toExpression: () => this.zodCall("literal", [literal ? ts.factory.createTrue() : ts.factory.createFalse()]) }; return { @@ -500,7 +522,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("number") + toExpression: () => this.zodCall("number") }; return { @@ -513,7 +535,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("bigint") + toExpression: () => this.zodCall("bigint") }; return { @@ -526,7 +548,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("boolean") + toExpression: () => this.zodCall("boolean") }; return { @@ -543,7 +565,7 @@ export class ZodFormat implements SerializationFormat { isNullable: false, toExpression: () => { // Use z.string() with transform to parse ISO strings to Date - return chainMethod(zodCall("string"), "transform", [ + return chainMethod(this.zodCall("string"), "transform", [ ts.factory.createArrowFunction( undefined, undefined, @@ -568,7 +590,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: true, // any includes null - toExpression: () => zodCall("any") + toExpression: () => this.zodCall("any") }; return { @@ -581,7 +603,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: true, // unknown can be undefined isNullable: false, - toExpression: () => zodCall("unknown") + toExpression: () => this.zodCall("unknown") }; return { @@ -594,7 +616,7 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => zodCall("never") + toExpression: () => this.zodCall("never") }; return { @@ -610,7 +632,7 @@ export class ZodFormat implements SerializationFormat { isOptional: schema.isOptional, isNullable: schema.isNullable, toExpression: () => - zodCall("lazy", [ + this.zodCall("lazy", [ ts.factory.createArrowFunction( undefined, undefined, @@ -633,7 +655,7 @@ export class ZodFormat implements SerializationFormat { isOptional: false, isNullable: schema.isNullable, toExpression: () => - zodCall("lazy", [ + this.zodCall("lazy", [ ts.factory.createArrowFunction( undefined, undefined, From 72794d0b08933aa210f344eb67b132cbb2add370 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 15:28:39 -0500 Subject: [PATCH 33/71] fixed missing zod import --- .../commons/src/serialization-pipeline/formats/ZodFormat.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 314943d73e56..5bdd6386e16a 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -680,6 +680,7 @@ export class ZodFormat implements SerializationFormat { public Schema = { _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { // For Zod, we use z.ZodType + this.ensureZodImport(); return ts.factory.createTypeReferenceNode( ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodType"), [parsedShape, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), rawShape] @@ -734,6 +735,7 @@ export class ZodFormat implements SerializationFormat { public ObjectSchema = { _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { // For Zod object schemas + this.ensureZodImport(); return ts.factory.createTypeReferenceNode( ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodObject"), [ From cd96c5e04f61f064b8ddf24000f4855232d0b76a Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 15:36:05 -0500 Subject: [PATCH 34/71] tweaked ast generation for zod --- .../formats/ZodFormat.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 5bdd6386e16a..24934b9a8a11 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -430,11 +430,25 @@ export class ZodFormat implements SerializationFormat { }; public set = (itemSchema: Schema): SchemaWithUtils => { - // Zod uses z.set() for Set types + // JSON wire format uses arrays for sets, so we parse array and transform to Set const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => this.zodCall("set", [itemSchema.toExpression()]) + toExpression: () => { + // z.array(itemSchema).transform(arr => new Set(arr)) + const arraySchema = this.zodCall("array", [itemSchema.toExpression()]); + const transformFn = ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "arr")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createNewExpression(ts.factory.createIdentifier("Set"), undefined, [ + ts.factory.createIdentifier("arr") + ]) + ); + return chainMethod(arraySchema, "transform", [transformFn]); + } }; return { @@ -734,17 +748,11 @@ export class ZodFormat implements SerializationFormat { public ObjectSchema = { _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { - // For Zod object schemas + // Use ZodType instead of ZodObject since transforms return ZodEffects this.ensureZodImport(); return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodObject"), - [ - ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), // shape - ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral("strip")), // unknownKeys - ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), // catchall - parsedShape, - rawShape - ] + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodType"), + [parsedShape, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), rawShape] ); } }; From 1922eeb83066f413bb8edc39ad40006c6b5659cf Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 15:41:10 -0500 Subject: [PATCH 35/71] updates test --- .../__tests__/__snapshots__/ZodFormat.test.ts.snap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap index 999144b14eac..6d941fd76dfb 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -6,7 +6,7 @@ exports[`ZodFormat AST Generation > Collection Schemas > nested list generates z exports[`ZodFormat AST Generation > Collection Schemas > record() generates z.record() 1`] = `"z.record(z.string(), z.number())"`; -exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.set() 1`] = `"z.set(z.number())"`; +exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.set() 1`] = `"z.array(z.number()).transform(arr => new Set(arr))"`; exports[`ZodFormat AST Generation > Enum Schemas > enum generates z.enum() 1`] = `"z.enum(["ACTIVE", "INACTIVE", "PENDING"])"`; From 7c837288d75ef4bb98248e9ef6817511b762f204 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 16:02:23 -0500 Subject: [PATCH 36/71] test updates --- .../src/serialization-pipeline/__tests__/ZodFormat.test.ts | 2 +- .../__tests__/__snapshots__/ZodFormat.test.ts.snap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index 996bc0929c48..b96adb69ff70 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -187,7 +187,7 @@ describe("ZodFormat AST Generation", () => { expect(ast).toMatchSnapshot(); }); - it("set() generates z.set()", () => { + it("set() generates z.array().transform()", () => { const schema = zod.set(zod.number()); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap index 6d941fd76dfb..bbb81942327f 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -6,7 +6,7 @@ exports[`ZodFormat AST Generation > Collection Schemas > nested list generates z exports[`ZodFormat AST Generation > Collection Schemas > record() generates z.record() 1`] = `"z.record(z.string(), z.number())"`; -exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.set() 1`] = `"z.array(z.number()).transform(arr => new Set(arr))"`; +exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.array().transform() 1`] = `"z.array(z.number()).transform(arr => new Set(arr))"`; exports[`ZodFormat AST Generation > Enum Schemas > enum generates z.enum() 1`] = `"z.enum(["ACTIVE", "INACTIVE", "PENDING"])"`; From 132841a8583a8ee70b8f5135815591175aaa9bff Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 16:32:36 -0500 Subject: [PATCH 37/71] typecast --- .../__tests__/__snapshots__/ZodFormat.test.ts.snap | 4 ++-- .../src/serialization-pipeline/formats/ZodFormat.ts | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap index bbb81942327f..5252be146113 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -103,10 +103,10 @@ exports[`ZodFormat AST Generation > Union Schemas > discriminated union generate "z.discriminatedUnion("type", [ z.object({ "type": z.literal("dog") }).merge(z.object({ "breed": z.string() - })), + }) as z.AnyZodObject), z.object({ "type": z.literal("cat") }).merge(z.object({ "indoor": z.boolean() - })) + }) as z.AnyZodObject) ])" `; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 24934b9a8a11..846393884ce1 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -327,6 +327,7 @@ export class ZodFormat implements SerializationFormat { isOptional: false, isNullable: false, toExpression: () => { + this.ensureZodImport(); // Use z.discriminatedUnion for better performance const variants = singleUnionTypes.map((variant) => { // Create an object schema with the discriminant + non-discriminant properties @@ -337,10 +338,19 @@ export class ZodFormat implements SerializationFormat { // Get the properties from the non-discriminant schema // We need to merge them with the discriminant + // Cast to z.AnyZodObject because the imported schema is typed as z.ZodType + // but .merge() requires ZodObject + const schemaWithCast = ts.factory.createAsExpression( + variant.nonDiscriminantProperties.toExpression(), + ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "AnyZodObject"), + undefined + ) + ); return chainMethod( this.zodCall("object", [ts.factory.createObjectLiteralExpression([discriminantProp], false)]), "merge", - [variant.nonDiscriminantProperties.toExpression()] + [schemaWithCast] ); }); From a6d1b3552252e43859b11666fef6c849e26c371e Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 16:47:48 -0500 Subject: [PATCH 38/71] using ZodTypeAny type eraser --- .../__tests__/ZodFormat.test.ts | 2 +- .../__snapshots__/ZodFormat.test.ts.snap | 2 +- .../formats/ZodFormat.ts | 18 ++++++++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index b96adb69ff70..ac8c44ccffaf 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -292,7 +292,7 @@ describe("ZodFormat AST Generation", () => { }); describe("Type References", () => { - it("Schema._getReferenceToType generates z.ZodType", () => { + it("Schema._getReferenceToType generates z.ZodTypeAny", () => { const rawShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); const parsedShape = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); const typeNode = zod.Schema._getReferenceToType({ rawShape, parsedShape }); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap index 5252be146113..649cd48d78de 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -97,7 +97,7 @@ exports[`ZodFormat AST Generation > Schema Modifiers > optionalNullable() genera exports[`ZodFormat AST Generation > Schema Operations > parse() generates .parse() 1`] = `"z.string().parse(rawValue)"`; -exports[`ZodFormat AST Generation > Type References > Schema._getReferenceToType generates z.ZodType 1`] = `"z.ZodType"`; +exports[`ZodFormat AST Generation > Type References > Schema._getReferenceToType generates z.ZodTypeAny 1`] = `"z.ZodTypeAny"`; exports[`ZodFormat AST Generation > Union Schemas > discriminated union generates z.discriminatedUnion() 1`] = ` "z.discriminatedUnion("type", [ diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 846393884ce1..7a0e83edcccc 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -702,12 +702,14 @@ export class ZodFormat implements SerializationFormat { // ==================== Type Utilities ==================== public Schema = { - _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { - // For Zod, we use z.ZodType + _getReferenceToType: (_args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + // Use z.ZodTypeAny to avoid type inference issues with transforms (ZodEffects) + // The parsed/raw shapes are not used because Zod's strict inference doesn't work + // well with discriminated unions and transforms that rename properties this.ensureZodImport(); return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodType"), - [parsedShape, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), rawShape] + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodTypeAny"), + undefined ); }, @@ -757,12 +759,12 @@ export class ZodFormat implements SerializationFormat { }; public ObjectSchema = { - _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { - // Use ZodType instead of ZodObject since transforms return ZodEffects + _getReferenceToType: (_args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + // Use z.ZodTypeAny to avoid type inference issues with transforms (ZodEffects) this.ensureZodImport(); return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodType"), - [parsedShape, ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), rawShape] + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodTypeAny"), + undefined ); } }; From 64d4513f4764baa776d1fec1d791ac2da39e6af7 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 17:08:00 -0500 Subject: [PATCH 39/71] fixed toExpression to transform into an array --- .../formats/ZodFormat.ts | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 7a0e83edcccc..bd2d834a0e2d 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -440,25 +440,14 @@ export class ZodFormat implements SerializationFormat { }; public set = (itemSchema: Schema): SchemaWithUtils => { - // JSON wire format uses arrays for sets, so we parse array and transform to Set + // JSON wire format uses arrays for sets + // We keep as array (not transform to Set) because: + // 1. JSON.stringify(Set) produces "{}" which breaks serialization + // 2. Arrays are JSON-compatible and work bidirectionally const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => { - // z.array(itemSchema).transform(arr => new Set(arr)) - const arraySchema = this.zodCall("array", [itemSchema.toExpression()]); - const transformFn = ts.factory.createArrowFunction( - undefined, - undefined, - [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "arr")], - undefined, - ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), - ts.factory.createNewExpression(ts.factory.createIdentifier("Set"), undefined, [ - ts.factory.createIdentifier("arr") - ]) - ); - return chainMethod(arraySchema, "transform", [transformFn]); - } + toExpression: () => this.zodCall("array", [itemSchema.toExpression()]) }; return { @@ -467,11 +456,13 @@ export class ZodFormat implements SerializationFormat { }; }; - public record = ({ keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => { + public record = ({ keySchema: _keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => { + // JSON object keys are always strings, so we use z.string() for the key + // regardless of the declared key type (e.g., even if Fern declares map) const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => this.zodCall("record", [keySchema.toExpression(), valueSchema.toExpression()]) + toExpression: () => this.zodCall("record", [this.zodCall("string"), valueSchema.toExpression()]) }; return { From 9ce20f13a6f261026f6382be523663998cc08993 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 17:08:14 -0500 Subject: [PATCH 40/71] updated tests --- .../src/serialization-pipeline/__tests__/ZodFormat.test.ts | 2 +- .../__tests__/__snapshots__/ZodFormat.test.ts.snap | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index ac8c44ccffaf..321d584ad1fa 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -187,7 +187,7 @@ describe("ZodFormat AST Generation", () => { expect(ast).toMatchSnapshot(); }); - it("set() generates z.array().transform()", () => { + it("set() generates z.array()", () => { const schema = zod.set(zod.number()); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap index 649cd48d78de..21f1b3fdf081 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -6,7 +6,7 @@ exports[`ZodFormat AST Generation > Collection Schemas > nested list generates z exports[`ZodFormat AST Generation > Collection Schemas > record() generates z.record() 1`] = `"z.record(z.string(), z.number())"`; -exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.array().transform() 1`] = `"z.array(z.number()).transform(arr => new Set(arr))"`; +exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.array() 1`] = `"z.array(z.number())"`; exports[`ZodFormat AST Generation > Enum Schemas > enum generates z.enum() 1`] = `"z.enum(["ACTIVE", "INACTIVE", "PENDING"])"`; From 0683c16310230da8967b809390aa40a201567af6 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 17:13:37 -0500 Subject: [PATCH 41/71] d --- .../src/serialization-pipeline/formats/ZodFormat.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index bd2d834a0e2d..9f4f3340b730 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -456,7 +456,13 @@ export class ZodFormat implements SerializationFormat { }; }; - public record = ({ keySchema: _keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => { + public record = ({ + keySchema: _keySchema, + valueSchema + }: { + keySchema: Schema; + valueSchema: Schema; + }): SchemaWithUtils => { // JSON object keys are always strings, so we use z.string() for the key // regardless of the declared key type (e.g., even if Fern declares map) const baseSchema: ZodBaseSchema = { From 189800c41723af00984c17f55f841c6be26387a3 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 17:45:22 -0500 Subject: [PATCH 42/71] implemented custom json serialization for zod to fix type mismatches --- .../__tests__/ZodFormat.test.ts | 88 +++++++++++++++++++ .../formats/ZodFormat.ts | 85 +++++++++++++++--- 2 files changed, 163 insertions(+), 10 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index 321d584ad1fa..7db1faf047a5 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -344,4 +344,92 @@ describe("ZodFormat AST Generation", () => { expect(patterns).toBeNull(); }); }); + + describe("JSON Serialization Compatibility", () => { + it("set() generates plain z.array() for JSON compatibility", () => { + // Sets must be arrays for JSON serialization to work correctly + // JSON.stringify(Set) produces "{}" which is wrong + const schema = zod.set(zod.string()); + const ast = printNode(schema.toExpression()); + // Should NOT contain .transform() - just a plain array + expect(ast).toBe("z.array(z.string())"); + expect(ast).not.toContain("transform"); + expect(ast).not.toContain("Set"); + }); + + it("set().json() generates Array.from() for Set serialization", () => { + // When serializing, we need to convert Set → Array + const schema = zod.set(zod.string()); + const valueExpr = ts.factory.createIdentifier("value"); + const jsonExpr = schema.json(valueExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false + }); + const ast = printNode(jsonExpr); + // Should generate Array.from(value) + expect(ast).toBe("Array.from(value)"); + }); + + it("set().optional().json() handles undefined correctly", () => { + // Optional set should check for null/undefined before converting + const schema = zod.set(zod.string()).optional(); + const valueExpr = ts.factory.createIdentifier("value"); + const jsonExpr = schema.json(valueExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false + }); + const ast = printNode(jsonExpr); + // Should generate: value !== null ? Array.from(value) : value + expect(ast).toContain("Array.from(value)"); + expect(ast).toContain("!=="); + expect(ast).toContain("null"); + }); + + it("record() always uses string keys for JSON compatibility", () => { + // JSON object keys are always strings, even if Fern declares map + const schema = zod.record({ + keySchema: zod.number(), // Even with number key schema + valueSchema: zod.string() + }); + const ast = printNode(schema.toExpression()); + // Key should be z.string(), not z.number() + expect(ast).toBe("z.record(z.string(), z.string())"); + }); + + it("record() ignores key schema and uses string", () => { + // Verify various key types all become string + const withBoolKey = zod.record({ + keySchema: zod.boolean(), + valueSchema: zod.number() + }); + const withAnyKey = zod.record({ + keySchema: zod.any(), + valueSchema: zod.string() + }); + + expect(printNode(withBoolKey.toExpression())).toContain("z.string()"); + expect(printNode(withAnyKey.toExpression())).toContain("z.string()"); + }); + + it("primitive types have no json transformation", () => { + // Primitives should just pass through + const stringSchema = zod.string(); + const valueExpr = ts.factory.createIdentifier("value"); + const jsonExpr = stringSchema.json(valueExpr, { + unrecognizedObjectKeys: "fail", + allowUnrecognizedUnionMembers: false, + allowUnrecognizedEnumValues: false, + skipValidation: false, + omitUndefined: false + }); + // Should just return the value as-is + expect(printNode(jsonExpr)).toBe("value"); + }); + }); }); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 9f4f3340b730..ddad9cfcf926 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -26,6 +26,12 @@ interface ZodBaseSchema extends Schema { toExpression: () => ts.Expression; isOptional: boolean; isNullable: boolean; + /** + * Optional: generate expression to serialize value to JSON. + * If not provided, value passes through unchanged. + * Used for types that need transformation (Set → Array, etc.) + */ + toJsonExpression?: (parsed: ts.Expression) => ts.Expression; } /** @@ -97,8 +103,10 @@ export class ZodFormat implements SerializationFormat { return chainMethod(baseSchema.toExpression(), "parse", [raw]); }, json: (parsed, _opts) => { - // For Zod, "json" (serialization) is just identity since Zod doesn't transform - // We return the parsed value as-is - actual serialization happens elsewhere + // Use schema-specific serialization if defined, otherwise pass through + if (baseSchema.toJsonExpression) { + return baseSchema.toJsonExpression(parsed); + } return parsed; }, parseOrThrow: (raw, _opts) => { @@ -106,7 +114,10 @@ export class ZodFormat implements SerializationFormat { return chainMethod(baseSchema.toExpression(), "parse", [raw]); }, jsonOrThrow: (parsed, _opts) => { - // Just return the value - no transformation needed + // Use schema-specific serialization if defined, otherwise pass through + if (baseSchema.toJsonExpression) { + return baseSchema.toJsonExpression(parsed); + } return parsed; }, transform: ({ transform, untransform }) => { @@ -130,7 +141,22 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: schema.isOptional, isNullable: true, - toExpression: () => chainMethod(schema.toExpression(), "nullable") + toExpression: () => chainMethod(schema.toExpression(), "nullable"), + // Preserve inner serialization, handling null: value != null ? transform(value) : null + toJsonExpression: schema.toJsonExpression + ? (parsed) => + ts.factory.createConditionalExpression( + ts.factory.createBinaryExpression( + parsed, + ts.SyntaxKind.ExclamationEqualsEqualsToken, + ts.factory.createNull() + ), + undefined, + schema.toJsonExpression!(parsed), + undefined, + ts.factory.createNull() + ) + : undefined }; return { ...baseSchema, @@ -142,7 +168,22 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: true, isNullable: schema.isNullable, - toExpression: () => chainMethod(schema.toExpression(), "optional") + toExpression: () => chainMethod(schema.toExpression(), "optional"), + // Preserve inner serialization, handling undefined: value != null ? transform(value) : value + toJsonExpression: schema.toJsonExpression + ? (parsed) => + ts.factory.createConditionalExpression( + ts.factory.createBinaryExpression( + parsed, + ts.SyntaxKind.ExclamationEqualsEqualsToken, + ts.factory.createNull() + ), + undefined, + schema.toJsonExpression!(parsed), + undefined, + parsed + ) + : undefined }; return { ...baseSchema, @@ -154,7 +195,22 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: true, isNullable: true, - toExpression: () => chainMethod(chainMethod(schema.toExpression(), "optional"), "nullable") + toExpression: () => chainMethod(chainMethod(schema.toExpression(), "optional"), "nullable"), + // Preserve inner serialization, handling null/undefined + toJsonExpression: schema.toJsonExpression + ? (parsed) => + ts.factory.createConditionalExpression( + ts.factory.createBinaryExpression( + parsed, + ts.SyntaxKind.ExclamationEqualsEqualsToken, + ts.factory.createNull() + ), + undefined, + schema.toJsonExpression!(parsed), + undefined, + parsed + ) + : undefined }; return { ...baseSchema, @@ -441,13 +497,22 @@ export class ZodFormat implements SerializationFormat { public set = (itemSchema: Schema): SchemaWithUtils => { // JSON wire format uses arrays for sets - // We keep as array (not transform to Set) because: - // 1. JSON.stringify(Set) produces "{}" which breaks serialization - // 2. Arrays are JSON-compatible and work bidirectionally + // Parsing: z.array() validates the input + // Serialization: Array.from() converts Set → Array (handles both Set and Array input) const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => this.zodCall("array", [itemSchema.toExpression()]) + toExpression: () => this.zodCall("array", [itemSchema.toExpression()]), + // For JSON serialization, convert Set to Array: Array.from(value) + toJsonExpression: (parsed) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("Array"), + "from" + ), + undefined, + [parsed] + ) }; return { From 0930f21f1cbebcef378fa6dfd4b8d7f22945061b Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 17:52:51 -0500 Subject: [PATCH 43/71] fixed missing parameters --- .../serialization-pipeline/__tests__/ZodFormat.test.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index 7db1faf047a5..96fc16b5f408 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -366,7 +366,8 @@ describe("ZodFormat AST Generation", () => { allowUnrecognizedUnionMembers: false, allowUnrecognizedEnumValues: false, skipValidation: false, - omitUndefined: false + omitUndefined: false, + breadcrumbsPrefix: [] }); const ast = printNode(jsonExpr); // Should generate Array.from(value) @@ -382,7 +383,8 @@ describe("ZodFormat AST Generation", () => { allowUnrecognizedUnionMembers: false, allowUnrecognizedEnumValues: false, skipValidation: false, - omitUndefined: false + omitUndefined: false, + breadcrumbsPrefix: [] }); const ast = printNode(jsonExpr); // Should generate: value !== null ? Array.from(value) : value @@ -426,7 +428,8 @@ describe("ZodFormat AST Generation", () => { allowUnrecognizedUnionMembers: false, allowUnrecognizedEnumValues: false, skipValidation: false, - omitUndefined: false + omitUndefined: false, + breadcrumbsPrefix: [] }); // Should just return the value as-is expect(printNode(jsonExpr)).toBe("value"); From f3531755d7d46c84c1aa91ffce4cc43f1e2ca502 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 17:54:47 -0500 Subject: [PATCH 44/71] fixed linter issue --- .../commons/src/serialization-pipeline/formats/ZodFormat.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index ddad9cfcf926..1a0abdf363e5 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -506,10 +506,7 @@ export class ZodFormat implements SerializationFormat { // For JSON serialization, convert Set to Array: Array.from(value) toJsonExpression: (parsed) => ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - ts.factory.createIdentifier("Array"), - "from" - ), + ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier("Array"), "from"), undefined, [parsed] ) From 8066cf3e150d87e5530e4da1197c78e4d0909599 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 18:13:11 -0500 Subject: [PATCH 45/71] fixed zod serialization and verified tests pass --- .../__tests__/ZodFormat.test.ts | 15 +++++----- .../__snapshots__/ZodFormat.test.ts.snap | 2 +- .../formats/ZodFormat.ts | 20 +++++++++++-- .../client/getAndReturnListOfObjects.ts | 15 ++-------- .../client/getAndReturnListOfPrimitives.ts | 14 ++------- .../client/getAndReturnMapOfPrimToObject.ts | 15 ++-------- .../client/getAndReturnMapPrimToPrim.ts | 14 ++------- .../container/client/getAndReturnOptional.ts | 15 ++-------- .../client/getAndReturnSetOfObjects.ts | 15 ++-------- .../client/getAndReturnSetOfPrimitives.ts | 14 ++------- .../httpMethods/client/testDelete.ts | 4 +-- .../resources/httpMethods/client/testGet.ts | 4 +-- ...tAndReturnNestedWithRequiredFieldAsList.ts | 9 ++---- .../params/client/getWithInlinePath.ts | 4 +-- .../resources/params/client/getWithPath.ts | 4 +-- .../params/client/modifyWithInlinePath.ts | 8 ++--- .../resources/params/client/modifyWithPath.ts | 6 ++-- .../primitive/client/getAndReturnBase64.ts | 8 ++--- .../primitive/client/getAndReturnBool.ts | 8 ++--- .../primitive/client/getAndReturnDate.ts | 7 ++--- .../primitive/client/getAndReturnDatetime.ts | 10 ++----- .../primitive/client/getAndReturnDouble.ts | 8 ++--- .../primitive/client/getAndReturnInt.ts | 7 ++--- .../primitive/client/getAndReturnLong.ts | 7 ++--- .../primitive/client/getAndReturnString.ts | 8 ++--- .../primitive/client/getAndReturnUuid.ts | 7 ++--- .../resources/put/types/ErrorCategory.ts | 9 ++---- .../resources/put/types/ErrorCode.ts | 30 +++++++++---------- .../endpoints/resources/put/types/Error_.ts | 16 +++++----- .../resources/put/types/PutResponse.ts | 11 ++----- .../resources/urls/client/noEndingSlash.ts | 4 +-- .../resources/urls/client/withEndingSlash.ts | 4 +-- .../resources/urls/client/withMixedCase.ts | 4 +-- .../resources/urls/client/withUnderscores.ts | 4 +-- .../types/BadObjectRequestInfo.ts | 11 ++----- .../client/requests/PostWithObjectBody.ts | 26 ++++++++-------- .../resources/noAuth/client/postWithNoAuth.ts | 4 +-- .../noReqBody/client/postWithNoRequestBody.ts | 4 +-- .../client/getWithCustomHeader.ts | 4 +-- .../resources/docs/types/ObjectWithDocs.ts | 11 ++----- .../resources/enum/types/WeatherReport.ts | 6 ++-- .../resources/object/types/DoubleOptional.ts | 11 ++----- .../types/NestedObjectWithOptionalField.ts | 11 ++----- .../types/NestedObjectWithRequiredField.ts | 11 ++----- .../object/types/ObjectWithMapOfMap.ts | 11 ++----- .../object/types/ObjectWithOptionalField.ts | 18 +++++------ .../object/types/ObjectWithRequiredField.ts | 11 ++----- .../resources/object/types/OptionalAlias.ts | 7 ++--- .../types/resources/union/types/Animal.ts | 9 +++--- .../types/resources/union/types/Cat.ts | 5 ++-- .../types/resources/union/types/Dog.ts | 5 ++-- 51 files changed, 173 insertions(+), 322 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index 96fc16b5f408..e6a8422fbfd5 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -187,7 +187,7 @@ describe("ZodFormat AST Generation", () => { expect(ast).toMatchSnapshot(); }); - it("set() generates z.array()", () => { + it("set() generates z.array().transform()", () => { const schema = zod.set(zod.number()); const ast = printNode(schema.toExpression()); expect(ast).toMatchSnapshot(); @@ -346,15 +346,14 @@ describe("ZodFormat AST Generation", () => { }); describe("JSON Serialization Compatibility", () => { - it("set() generates plain z.array() for JSON compatibility", () => { - // Sets must be arrays for JSON serialization to work correctly - // JSON.stringify(Set) produces "{}" which is wrong + it("set() generates z.array().transform() for parsing and toJsonExpression for serialization", () => { + // Parsing: array → Set via transform + // Serialization: Set → Array via toJsonExpression const schema = zod.set(zod.string()); const ast = printNode(schema.toExpression()); - // Should NOT contain .transform() - just a plain array - expect(ast).toBe("z.array(z.string())"); - expect(ast).not.toContain("transform"); - expect(ast).not.toContain("Set"); + // Should contain transform to create Set from array + expect(ast).toContain("transform"); + expect(ast).toContain("new Set"); }); it("set().json() generates Array.from() for Set serialization", () => { diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap index 21f1b3fdf081..649cd48d78de 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -6,7 +6,7 @@ exports[`ZodFormat AST Generation > Collection Schemas > nested list generates z exports[`ZodFormat AST Generation > Collection Schemas > record() generates z.record() 1`] = `"z.record(z.string(), z.number())"`; -exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.array() 1`] = `"z.array(z.number())"`; +exports[`ZodFormat AST Generation > Collection Schemas > set() generates z.array().transform() 1`] = `"z.array(z.number()).transform(arr => new Set(arr))"`; exports[`ZodFormat AST Generation > Enum Schemas > enum generates z.enum() 1`] = `"z.enum(["ACTIVE", "INACTIVE", "PENDING"])"`; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 1a0abdf363e5..5dd63002d13c 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -497,12 +497,26 @@ export class ZodFormat implements SerializationFormat { public set = (itemSchema: Schema): SchemaWithUtils => { // JSON wire format uses arrays for sets - // Parsing: z.array() validates the input - // Serialization: Array.from() converts Set → Array (handles both Set and Array input) + // Parsing: z.array().transform(arr => new Set(arr)) converts array → Set + // Serialization: Array.from() converts Set → Array const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => this.zodCall("array", [itemSchema.toExpression()]), + toExpression: () => { + // z.array(itemSchema).transform(arr => new Set(arr)) + const arraySchema = this.zodCall("array", [itemSchema.toExpression()]); + const transformFn = ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "arr")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createNewExpression(ts.factory.createIdentifier("Set"), undefined, [ + ts.factory.createIdentifier("arr") + ]) + ); + return chainMethod(arraySchema, "transform", [transformFn]); + }, // For JSON serialization, convert Set to Array: Array.from(value) toJsonExpression: (parsed) => ts.factory.createCallExpression( diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts index 00a6afb4836c..5f75410634ad 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -1,24 +1,15 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodType< - SeedExhaustive.types.ObjectWithRequiredField[], - any, - serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw -> = z.array(ObjectWithRequiredField); +export const Request: z.ZodTypeAny = z.array(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: z.ZodType< - SeedExhaustive.types.ObjectWithRequiredField[], - any, - serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw -> = z.array(ObjectWithRequiredField); +export const Response: z.ZodTypeAny = z.array(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts index a4b45466dade..0ef52f69076f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -1,22 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType< - string[], - any, - serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw -> = z.array(z.string()); +export const Request: z.ZodTypeAny = z.array(z.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: z.ZodType< - string[], - any, - serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw -> = z.array(z.string()); +export const Response: z.ZodTypeAny = z.array(z.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts index 166bd3e29a62..c42e474a152f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -1,24 +1,15 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodType< - Record, - any, - serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw -> = z.record(z.string(), ObjectWithRequiredField); +export const Request: z.ZodTypeAny = z.record(z.string(), ObjectWithRequiredField); export declare namespace Request { export type Raw = Record; } -export const Response: z.ZodType< - Record, - any, - serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw -> = z.record(z.string(), ObjectWithRequiredField); +export const Response: z.ZodTypeAny = z.record(z.string(), ObjectWithRequiredField); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts index 30de46f1edeb..c04e11d33ce6 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -1,22 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType< - Record, - any, - serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw -> = z.record(z.string(), z.string()); +export const Request: z.ZodTypeAny = z.record(z.string(), z.string()); export declare namespace Request { export type Raw = Record; } -export const Response: z.ZodType< - Record, - any, - serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw -> = z.record(z.string(), z.string()); +export const Response: z.ZodTypeAny = z.record(z.string(), z.string()); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts index f2897ba77737..deb15ce95797 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -1,24 +1,15 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import type { z } from "zod"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodType< - SeedExhaustive.types.ObjectWithRequiredField | undefined, - any, - serializers.endpoints.container.getAndReturnOptional.Request.Raw -> = ObjectWithRequiredField.optional(); +export const Request: z.ZodTypeAny = ObjectWithRequiredField.optional(); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw | null | undefined; } -export const Response: z.ZodType< - SeedExhaustive.types.ObjectWithRequiredField | undefined, - any, - serializers.endpoints.container.getAndReturnOptional.Response.Raw -> = ObjectWithRequiredField.optional(); +export const Response: z.ZodTypeAny = ObjectWithRequiredField.optional(); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw | null | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts index 32656770c952..5f75410634ad 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -1,24 +1,15 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodType< - SeedExhaustive.types.ObjectWithRequiredField[], - any, - serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw -> = z.array(ObjectWithRequiredField); +export const Request: z.ZodTypeAny = z.array(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: z.ZodType< - SeedExhaustive.types.ObjectWithRequiredField[], - any, - serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw -> = z.array(ObjectWithRequiredField); +export const Response: z.ZodTypeAny = z.array(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts index 079965c08bd3..5aeb5eb7b7cd 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -1,22 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType< - Set, - any, - serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw -> = z.set(z.string()); +export const Request: z.ZodTypeAny = z.array(z.string()).transform((arr) => new Set(arr)); export declare namespace Request { export type Raw = string[]; } -export const Response: z.ZodType< - Set, - any, - serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw -> = z.set(z.string()); +export const Response: z.ZodTypeAny = z.array(z.string()).transform((arr) => new Set(arr)); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts index 2f4ecf18a328..79e0615b9086 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.boolean(); +export const Response: z.ZodTypeAny = z.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts index 551bd2fcdbbb..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts index 7f43f3e26ad6..6abdb01c2536 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -1,14 +1,9 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; -export const Request: z.ZodType< - SeedExhaustive.types.NestedObjectWithRequiredField[], - any, - serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw -> = z.array(NestedObjectWithRequiredField); +export const Request: z.ZodTypeAny = z.array(NestedObjectWithRequiredField); export declare namespace Request { export type Raw = NestedObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts index b81110872ebf..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts index 430211bcc6dd..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts index d20ce2e56863..d89fd639a0e9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -1,16 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = - z.string(); +export const Request: z.ZodTypeAny = z.string(); export declare namespace Request { export type Raw = string; } -export const Response: z.ZodType = - z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts index 0031f1c12180..d89fd639a0e9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = z.string(); +export const Request: z.ZodTypeAny = z.string(); export declare namespace Request { export type Raw = string; } -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts index 3e190f6f2509..d89fd639a0e9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -1,16 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = - z.string(); +export const Request: z.ZodTypeAny = z.string(); export declare namespace Request { export type Raw = string; } -export const Response: z.ZodType = - z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts index 4f3b9ad120db..b2514975ed69 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -1,16 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = - z.boolean(); +export const Request: z.ZodTypeAny = z.boolean(); export declare namespace Request { export type Raw = boolean; } -export const Response: z.ZodType = - z.boolean(); +export const Response: z.ZodTypeAny = z.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts index 955f63f9f365..d89fd639a0e9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -1,15 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = z.string(); +export const Request: z.ZodTypeAny = z.string(); export declare namespace Request { export type Raw = string; } -export const Response: z.ZodType = - z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts index 479858888358..1f5ec890abaa 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -1,18 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = z - .string() - .transform((s) => new Date(s)); +export const Request: z.ZodTypeAny = z.string().transform((s) => new Date(s)); export declare namespace Request { export type Raw = string; } -export const Response: z.ZodType = z - .string() - .transform((s) => new Date(s)); +export const Response: z.ZodTypeAny = z.string().transform((s) => new Date(s)); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts index d1732819ad82..fa773ba5afd7 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -1,16 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = - z.number(); +export const Request: z.ZodTypeAny = z.number(); export declare namespace Request { export type Raw = number; } -export const Response: z.ZodType = - z.number(); +export const Response: z.ZodTypeAny = z.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts index 30ebed457d14..fa773ba5afd7 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -1,15 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = z.number(); +export const Request: z.ZodTypeAny = z.number(); export declare namespace Request { export type Raw = number; } -export const Response: z.ZodType = - z.number(); +export const Response: z.ZodTypeAny = z.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts index 8d873f768a88..fa773ba5afd7 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -1,15 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = z.number(); +export const Request: z.ZodTypeAny = z.number(); export declare namespace Request { export type Raw = number; } -export const Response: z.ZodType = - z.number(); +export const Response: z.ZodTypeAny = z.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts index 0bf6bc44aef3..d89fd639a0e9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -1,16 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = - z.string(); +export const Request: z.ZodTypeAny = z.string(); export declare namespace Request { export type Raw = string; } -export const Response: z.ZodType = - z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts index 0802f58c03cb..d89fd639a0e9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -1,15 +1,14 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = z.string(); +export const Request: z.ZodTypeAny = z.string(); export declare namespace Request { export type Raw = string; } -export const Response: z.ZodType = - z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts index fbc0172f82b8..6c67652cba7f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -1,13 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const ErrorCategory: z.ZodType< - SeedExhaustive.endpoints.ErrorCategory, - any, - serializers.endpoints.ErrorCategory.Raw -> = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +export const ErrorCategory: z.ZodTypeAny = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); export declare namespace ErrorCategory { export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts index 7151824dddec..539a81e75f62 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -1,22 +1,20 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const ErrorCode: z.ZodType = - z.enum([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", - ]); +export const ErrorCode: z.ZodTypeAny = z.enum([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); export declare namespace ErrorCode { export type Raw = diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts index c6587a43a510..ddb93a2d85f0 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -1,17 +1,15 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { ErrorCategory } from "./ErrorCategory.js"; import { ErrorCode } from "./ErrorCode.js"; -export const Error_: z.ZodObject = - z.object({ - category: ErrorCategory, - code: ErrorCode, - detail: z.string().optional(), - field: z.string().optional(), - }); +export const Error_: z.ZodTypeAny = z.object({ + category: ErrorCategory, + code: ErrorCode, + detail: z.string().optional(), + field: z.string().optional(), +}); export declare namespace Error_ { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts index d53589715c26..645a31bd52e6 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -1,16 +1,9 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { Error_ } from "./Error_.js"; -export const PutResponse: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.endpoints.PutResponse, - serializers.endpoints.PutResponse.Raw -> = z.object({ +export const PutResponse: z.ZodTypeAny = z.object({ errors: z.array(Error_).optional(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts index b2b91c040278..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts index 5cd391fdb98b..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts index 70eb829ab641..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts index 9fe73dc611c5..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts index d1f725aa0f13..562ead36ec61 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -1,15 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../api/index.js"; -import type * as serializers from "../../../index.js"; +import { z } from "zod"; -export const BadObjectRequestInfo: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.BadObjectRequestInfo, - serializers.BadObjectRequestInfo.Raw -> = z.object({ +export const BadObjectRequestInfo: z.ZodTypeAny = z.object({ message: z.string(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts index c2ce70ab5e4f..a3fded466e98 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -1,21 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../api/index.js"; -import type * as serializers from "../../../../index.js"; +import { z } from "zod"; import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; -export const PostWithObjectBody: z.ZodType = - z - .object({ - string: z.string(), - integer: z.number(), - NestedObject: ObjectWithOptionalField, - }) - .transform((data) => ({ - string: data.string, - integer: data.integer, - nestedObject: data.NestedObject, - })); +export const PostWithObjectBody: z.ZodTypeAny = z + .object({ + string: z.string(), + integer: z.number(), + NestedObject: ObjectWithOptionalField, + }) + .transform((data) => ({ + string: data.string, + integer: data.integer, + nestedObject: data.NestedObject, + })); export declare namespace PostWithObjectBody { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts index 10d91fcc521f..79e0615b9086 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.boolean(); +export const Response: z.ZodTypeAny = z.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts index b00329f8b977..4d16f644374f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../index.js"; +import { z } from "zod"; -export const Response: z.ZodType = z.string(); +export const Response: z.ZodTypeAny = z.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts index 63acac04813a..6d9175922020 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -1,8 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as serializers from "../../../index.js"; +import { z } from "zod"; -export const Request: z.ZodType = z.string(); +export const Request: z.ZodTypeAny = z.string(); export declare namespace Request { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts index e4299f7d9a53..df2265b7d957 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -1,15 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const ObjectWithDocs: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.types.ObjectWithDocs, - serializers.types.ObjectWithDocs.Raw -> = z.object({ +export const ObjectWithDocs: z.ZodTypeAny = z.object({ string: z.string(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts index f87a46f92c84..61a2d8e15121 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -1,10 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const WeatherReport: z.ZodType = - z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +export const WeatherReport: z.ZodTypeAny = z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); export declare namespace WeatherReport { export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts index d96691c18bcc..02718a049540 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -1,16 +1,9 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { OptionalAlias } from "./OptionalAlias.js"; -export const DoubleOptional: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.types.DoubleOptional, - serializers.types.DoubleOptional.Raw -> = z.object({ +export const DoubleOptional: z.ZodTypeAny = z.object({ optionalAlias: OptionalAlias.optional(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts index 056015a99f36..9845d814508f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -1,16 +1,9 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithOptionalField: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.types.NestedObjectWithOptionalField, - serializers.types.NestedObjectWithOptionalField.Raw -> = z +export const NestedObjectWithOptionalField: z.ZodTypeAny = z .object({ string: z.string().optional(), NestedObject: ObjectWithOptionalField.optional(), diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts index d67da1f455a6..f91bcd50dcde 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -1,16 +1,9 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithRequiredField: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.types.NestedObjectWithRequiredField, - serializers.types.NestedObjectWithRequiredField.Raw -> = z +export const NestedObjectWithRequiredField: z.ZodTypeAny = z .object({ string: z.string(), NestedObject: ObjectWithOptionalField, diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts index 3aa689a9dcf5..8d7eb454cdc6 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -1,15 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const ObjectWithMapOfMap: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.types.ObjectWithMapOfMap, - serializers.types.ObjectWithMapOfMap.Raw -> = z.object({ +export const ObjectWithMapOfMap: z.ZodTypeAny = z.object({ map: z.record(z.string(), z.record(z.string(), z.string())), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts index 18c6e41f8929..1d23880450ec 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -1,15 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const ObjectWithOptionalField: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.types.ObjectWithOptionalField, - serializers.types.ObjectWithOptionalField.Raw -> = z.object({ +export const ObjectWithOptionalField: z.ZodTypeAny = z.object({ string: z.string().optional(), integer: z.number().optional(), long: z.number().optional(), @@ -23,8 +16,11 @@ export const ObjectWithOptionalField: z.ZodObject< uuid: z.string().optional(), base64: z.string().optional(), list: z.array(z.string()).optional(), - set: z.set(z.string()).optional(), - map: z.record(z.number(), z.string()).optional(), + set: z + .array(z.string()) + .transform((arr) => new Set(arr)) + .optional(), + map: z.record(z.string(), z.string()).optional(), bigint: z.string().optional(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts index c111b94b9bde..1ec1d457161b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -1,15 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const ObjectWithRequiredField: z.ZodObject< - any, - "strip", - any, - SeedExhaustive.types.ObjectWithRequiredField, - serializers.types.ObjectWithRequiredField.Raw -> = z.object({ +export const ObjectWithRequiredField: z.ZodTypeAny = z.object({ string: z.string(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts index e859962c98ad..c26f233ba016 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -1,11 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const OptionalAlias: z.ZodType = z - .string() - .optional(); +export const OptionalAlias: z.ZodTypeAny = z.string().optional(); export declare namespace OptionalAlias { export type Raw = string | null | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts index d9988551eff7..2636ac268e47 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts @@ -1,14 +1,13 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; import { Cat } from "./Cat.js"; import { Dog } from "./Dog.js"; -export const Animal: z.ZodType = z +export const Animal: z.ZodTypeAny = z .discriminatedUnion("animal", [ - z.object({ animal: z.literal("dog") }).merge(Dog), - z.object({ animal: z.literal("cat") }).merge(Cat), + z.object({ animal: z.literal("dog") }).merge(Dog as z.AnyZodObject), + z.object({ animal: z.literal("cat") }).merge(Cat as z.AnyZodObject), ]) .transform((value) => value); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts index 62b3cd160a2e..d62218895b75 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts @@ -1,9 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Cat: z.ZodObject = z.object({ +export const Cat: z.ZodTypeAny = z.object({ name: z.string(), likesToMeow: z.boolean(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts index 86c0a7ebbb2e..f04e50af298c 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts @@ -1,9 +1,8 @@ // This file was auto-generated by Fern from our API Definition. -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; +import { z } from "zod"; -export const Dog: z.ZodObject = z.object({ +export const Dog: z.ZodTypeAny = z.object({ name: z.string(), likesToWoof: z.boolean(), }); From 33257af96c1227f1926c0cff9e7b5aad3de74007 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 18:42:13 -0500 Subject: [PATCH 46/71] added initial recursive implementation, runs at O(n) --- .../formats/ZodFormat.ts | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 5dd63002d13c..ee599dbdf7f4 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -305,6 +305,36 @@ export class ZodFormat implements SerializationFormat { // ==================== Object Schema Builders ==================== public object = (properties: Property[]): ObjectSchema => { + // Check if any property has toJsonExpression (needs serialization transform) + const propsWithJsonTransform = properties.filter( + (p) => (p.value as ZodBaseSchema).toJsonExpression != null + ); + + // Create toJsonExpression for objects that recursively transforms properties + const createObjectJsonExpression = (parsed: ts.Expression): ts.Expression => { + if (propsWithJsonTransform.length === 0) { + return parsed; // No transform needed + } + // Generate: { ...parsed, propName: Array.from(parsed.propName), ... } + const propAssignments: ts.ObjectLiteralElementLike[] = [ + ts.factory.createSpreadAssignment(parsed) + ]; + for (const prop of propsWithJsonTransform) { + const propSchema = prop.value as ZodBaseSchema; + if (propSchema.toJsonExpression) { + propAssignments.push( + ts.factory.createPropertyAssignment( + prop.key.raw, // Use raw key for wire format + propSchema.toJsonExpression( + ts.factory.createPropertyAccessExpression(parsed, prop.key.parsed) + ) + ) + ); + } + } + return ts.factory.createObjectLiteralExpression(propAssignments, true); + }; + const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -320,7 +350,9 @@ export class ZodFormat implements SerializationFormat { }); return this.zodCall("object", [ts.factory.createObjectLiteralExpression(propAssignments, true)]); - } + }, + toJsonExpression: + propsWithJsonTransform.length > 0 ? createObjectJsonExpression : undefined }; // If any properties have different raw/parsed keys, wrap with transform @@ -351,7 +383,9 @@ export class ZodFormat implements SerializationFormat { ) ); return chainMethod(inner, "transform", [transformExpr]); - } + }, + toJsonExpression: + propsWithJsonTransform.length > 0 ? createObjectJsonExpression : undefined }; return { ...transformedBase, From 75992c81be00efa7938378e4467b3b31e1ed18b5 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 18:46:50 -0500 Subject: [PATCH 47/71] comments about recursive serialization for zod --- .../formats/ZodFormat.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index ee599dbdf7f4..67c07550caad 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -310,12 +310,28 @@ export class ZodFormat implements SerializationFormat { (p) => (p.value as ZodBaseSchema).toJsonExpression != null ); - // Create toJsonExpression for objects that recursively transforms properties + /** + * Creates a toJsonExpression for objects that recursively transforms properties needing serialization. + * + * COMPLEXITY: O(n) where n = number of properties at each level with transforms. + * The spread operator copies all properties, even unchanged ones, at each level on the path + * to a property requiring transformation (e.g., Set → Array). + * + * POTENTIAL IMPROVEMENTS (follow-up work): + * 1. Persistent data structures (HAMT/Immutable.js): O(log n) updates with structural sharing, + * but requires changing the entire data model and adds ~50KB bundle size. + * 2. Lazy/Proxy-based transforms: Defer transformation until JSON.stringify, achieving O(k) + * where k = properties actually serialized. Adds runtime complexity. + * 3. Surgical Object.assign: Minor constant-factor improvement, same O(n) complexity. + * + * For typical API payloads (< 100 properties), current O(n) is acceptable. + */ const createObjectJsonExpression = (parsed: ts.Expression): ts.Expression => { if (propsWithJsonTransform.length === 0) { - return parsed; // No transform needed + return parsed; // No transform needed - O(1) } // Generate: { ...parsed, propName: Array.from(parsed.propName), ... } + // This spreads all properties (O(n)) then overwrites transformed ones const propAssignments: ts.ObjectLiteralElementLike[] = [ ts.factory.createSpreadAssignment(parsed) ]; From f0334a8643a6eb1cfedfa8605e1aefa988f74c5f Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 19:38:24 -0500 Subject: [PATCH 48/71] fixed final zod tests --- .../src/AbstractGeneratedSchema.ts | 145 ++++++- .../SerializationFormat.ts | 7 + .../formats/ZodFormat.ts | 359 ++++++++++++++---- .../formats/ZurgFormat.ts | 2 +- .../resources/container/client/Client.ts | 37 +- .../resources/contentType/client/Client.ts | 5 +- .../endpoints/resources/enum/client/Client.ts | 7 +- .../resources/httpMethods/client/Client.ts | 16 +- .../resources/object/client/Client.ts | 24 +- .../resources/params/client/Client.ts | 12 +- .../resources/primitive/client/Client.ts | 36 +- .../endpoints/resources/put/client/Client.ts | 2 +- .../resources/union/client/Client.ts | 4 +- .../endpoints/resources/urls/client/Client.ts | 8 +- .../inlinedRequests/client/Client.ts | 6 +- .../src/api/resources/noAuth/client/Client.ts | 4 +- .../api/resources/noReqBody/client/Client.ts | 4 +- .../resources/reqWithHeaders/client/Client.ts | 3 +- .../client/getAndReturnListOfObjects.ts | 34 +- .../client/getAndReturnListOfPrimitives.ts | 23 +- .../client/getAndReturnMapOfPrimToObject.ts | 35 +- .../client/getAndReturnMapPrimToPrim.ts | 25 +- .../container/client/getAndReturnOptional.ts | 34 +- .../client/getAndReturnSetOfObjects.ts | 34 +- .../client/getAndReturnSetOfPrimitives.ts | 25 +- .../httpMethods/client/testDelete.ts | 12 +- .../resources/httpMethods/client/testGet.ts | 12 +- ...tAndReturnNestedWithRequiredFieldAsList.ts | 18 +- .../params/client/getWithInlinePath.ts | 12 +- .../resources/params/client/getWithPath.ts | 12 +- .../params/client/modifyWithInlinePath.ts | 23 +- .../resources/params/client/modifyWithPath.ts | 23 +- .../primitive/client/getAndReturnBase64.ts | 23 +- .../primitive/client/getAndReturnBool.ts | 23 +- .../primitive/client/getAndReturnDate.ts | 23 +- .../primitive/client/getAndReturnDatetime.ts | 23 +- .../primitive/client/getAndReturnDouble.ts | 23 +- .../primitive/client/getAndReturnInt.ts | 23 +- .../primitive/client/getAndReturnLong.ts | 23 +- .../primitive/client/getAndReturnString.ts | 23 +- .../primitive/client/getAndReturnUuid.ts | 23 +- .../resources/put/types/ErrorCategory.ts | 13 +- .../resources/put/types/ErrorCode.ts | 13 +- .../endpoints/resources/put/types/Error_.ts | 23 +- .../resources/put/types/PutResponse.ts | 23 +- .../resources/urls/client/noEndingSlash.ts | 12 +- .../resources/urls/client/withEndingSlash.ts | 12 +- .../resources/urls/client/withMixedCase.ts | 12 +- .../resources/urls/client/withUnderscores.ts | 12 +- .../types/BadObjectRequestInfo.ts | 13 +- .../client/requests/PostWithObjectBody.ts | 20 +- .../resources/noAuth/client/postWithNoAuth.ts | 12 +- .../noReqBody/client/postWithNoRequestBody.ts | 12 +- .../client/getWithCustomHeader.ts | 12 +- .../resources/docs/types/ObjectWithDocs.ts | 13 +- .../resources/enum/types/WeatherReport.ts | 13 +- .../resources/object/types/DoubleOptional.ts | 23 +- .../types/NestedObjectWithOptionalField.ts | 27 +- .../types/NestedObjectWithRequiredField.ts | 22 +- .../object/types/ObjectWithMapOfMap.ts | 13 +- .../object/types/ObjectWithOptionalField.ts | 33 +- .../object/types/ObjectWithRequiredField.ts | 14 +- .../resources/object/types/OptionalAlias.ts | 13 +- .../types/resources/union/types/Animal.ts | 17 +- .../types/resources/union/types/Cat.ts | 13 +- .../types/resources/union/types/Dog.ts | 13 +- 66 files changed, 1380 insertions(+), 233 deletions(-) diff --git a/generators/typescript/utils/abstract-schema-generator/src/AbstractGeneratedSchema.ts b/generators/typescript/utils/abstract-schema-generator/src/AbstractGeneratedSchema.ts index 651247c1d1f0..9c816f6bd45a 100644 --- a/generators/typescript/utils/abstract-schema-generator/src/AbstractGeneratedSchema.ts +++ b/generators/typescript/utils/abstract-schema-generator/src/AbstractGeneratedSchema.ts @@ -18,23 +18,136 @@ export abstract class AbstractGeneratedSchema { } public writeSchemaToFile(context: Context): void { - context.sourceFile.addVariableStatement({ - isExported: true, - declarationKind: VariableDeclarationKind.Const, - declarations: [ - { - name: this.typeName, - type: getTextOfTsNode( - this.getReferenceToSchemaType({ - context, - rawShape: this.getReferenceToRawShape(context), - parsedShape: this.getReferenceToParsedShape(context) - }) + const schema = this.buildSchema(context); + const schemaExpression = schema.toExpression(); + const toJsonExpression = schema.toJsonExpression; + + // For Zod format, always generate a wrapper object with parse and json methods + // This is needed because Zod schemas don't have built-in bidirectional serialization + if (context.coreUtilities.zurg.name === "zod") { + // Generate: + // const __Schema = ; + // export const = { _schema: __Schema, parse: ..., json: ... }; + const internalSchemaName = `_${this.typeName}_Schema`; + const parsedParam = ts.factory.createIdentifier("parsed"); + const rawParam = ts.factory.createIdentifier("raw"); + const schemaRef = ts.factory.createIdentifier(internalSchemaName); + + // First, add the internal schema variable + context.sourceFile.addVariableStatement({ + isExported: false, + declarationKind: VariableDeclarationKind.Const, + declarations: [ + { + name: internalSchemaName, + initializer: getTextOfTsNode(schemaExpression) + } + ] + }); + + // If no toJsonExpression, use identity function: (parsed) => parsed + const jsonBody = toJsonExpression ? toJsonExpression(parsedParam) : parsedParam; + + // Get the type nodes for parameter annotations + const parsedTypeNode = this.getReferenceToParsedShape(context); + + // Get the raw type node for json return type cast + const rawTypeNode = this.getReferenceToRawShape(context); + + const wrapperObject = ts.factory.createObjectLiteralExpression( + [ + ts.factory.createPropertyAssignment("_schema", schemaRef), + ts.factory.createPropertyAssignment( + "parse", + ts.factory.createArrowFunction( + undefined, + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + rawParam, + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword) + ) + ], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + // Cast the parse result to the expected Parsed type to fix Zod's loose inference + ts.factory.createAsExpression( + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(schemaRef, "parse"), + undefined, + [rawParam] + ), + parsedTypeNode + ) + ) ), - initializer: getTextOfTsNode(this.buildSchema(context).toExpression()) - } - ] - }); + ts.factory.createPropertyAssignment( + "json", + ts.factory.createArrowFunction( + undefined, + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + parsedParam, + undefined, + parsedTypeNode + ) + ], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + // Cast the json result to the expected Raw type + ts.factory.createAsExpression(jsonBody, rawTypeNode) + ) + ) + ], + true + ); + + // Then add the exported wrapper + context.sourceFile.addVariableStatement({ + isExported: true, + declarationKind: VariableDeclarationKind.Const, + declarations: [ + { + name: this.typeName, + type: getTextOfTsNode( + this.getReferenceToSchemaType({ + context, + rawShape: this.getReferenceToRawShape(context), + parsedShape: this.getReferenceToParsedShape(context) + }) + ), + initializer: getTextOfTsNode(wrapperObject) + } + ] + }); + } else { + // Original behavior for Zurg format + context.sourceFile.addVariableStatement({ + isExported: true, + declarationKind: VariableDeclarationKind.Const, + declarations: [ + { + name: this.typeName, + type: getTextOfTsNode( + this.getReferenceToSchemaType({ + context, + rawShape: this.getReferenceToRawShape(context), + parsedShape: this.getReferenceToParsedShape(context) + }) + ), + initializer: getTextOfTsNode(schemaExpression) + } + ] + }); + } this.generateModule(context); } diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts index cce51396e972..5f60004de6b7 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts @@ -33,6 +33,13 @@ export interface Schema { * Whether this schema represents a nullable value */ isNullable: boolean; + + /** + * Optional: Generate expression to serialize parsed value to JSON. + * If not provided, value passes through unchanged. + * Used for types that need transformation during serialization (Set → Array, etc.) + */ + toJsonExpression?: (parsed: ts.Expression) => ts.Expression; } /** diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 67c07550caad..63b13575273d 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -15,7 +15,9 @@ import { } from "../SerializationFormat"; /** - * Zod version to use as dependency + * Zod version to use as dependency. + * @todo Make this configurable from a client standpoint. This would be complex to implement because it would likely + * involve scanning Zod's api at the given version and code-generating based on the results of the scan. */ const ZOD_VERSION = "^3.23.0"; @@ -26,6 +28,7 @@ interface ZodBaseSchema extends Schema { toExpression: () => ts.Expression; isOptional: boolean; isNullable: boolean; + /** * Optional: generate expression to serialize value to JSON. * If not provided, value passes through unchanged. @@ -35,7 +38,7 @@ interface ZodBaseSchema extends Schema { } /** - * Helper to create a property access expression like `z.string()` + * Helper to create a property access expression like `z.string()`. */ function createZodCall(methodName: string, args: ts.Expression[] = []): ts.Expression { return ts.factory.createCallExpression( @@ -137,18 +140,22 @@ export class ZodFormat implements SerializationFormat { }; } + /** + * Wrap schema to allow null values. + */ private nullable(schema: ZodBaseSchema): SchemaWithUtils { const baseSchema: ZodBaseSchema = { isOptional: schema.isOptional, isNullable: true, toExpression: () => chainMethod(schema.toExpression(), "nullable"), // Preserve inner serialization, handling null: value != null ? transform(value) : null + // Use != (loose inequality) to catch both null and undefined toJsonExpression: schema.toJsonExpression ? (parsed) => ts.factory.createConditionalExpression( ts.factory.createBinaryExpression( parsed, - ts.SyntaxKind.ExclamationEqualsEqualsToken, + ts.SyntaxKind.ExclamationEqualsToken, // != (loose) ts.factory.createNull() ), undefined, @@ -164,18 +171,22 @@ export class ZodFormat implements SerializationFormat { }; } + /** + * Wrap schema to allow undefined values. + */ private optional(schema: ZodBaseSchema): SchemaWithUtils { const baseSchema: ZodBaseSchema = { isOptional: true, isNullable: schema.isNullable, toExpression: () => chainMethod(schema.toExpression(), "optional"), // Preserve inner serialization, handling undefined: value != null ? transform(value) : value + // Use != (loose inequality) to check for both null and undefined toJsonExpression: schema.toJsonExpression ? (parsed) => ts.factory.createConditionalExpression( ts.factory.createBinaryExpression( parsed, - ts.SyntaxKind.ExclamationEqualsEqualsToken, + ts.SyntaxKind.ExclamationEqualsToken, // != (loose) to catch both null and undefined ts.factory.createNull() ), undefined, @@ -191,18 +202,22 @@ export class ZodFormat implements SerializationFormat { }; } + /** + * Wrap schema to allow both null and undefined values. + */ private optionalNullable(schema: ZodBaseSchema): SchemaWithUtils { const baseSchema: ZodBaseSchema = { isOptional: true, isNullable: true, toExpression: () => chainMethod(chainMethod(schema.toExpression(), "optional"), "nullable"), // Preserve inner serialization, handling null/undefined + // Use != (loose inequality) to catch both null and undefined toJsonExpression: schema.toJsonExpression ? (parsed) => ts.factory.createConditionalExpression( ts.factory.createBinaryExpression( parsed, - ts.SyntaxKind.ExclamationEqualsEqualsToken, + ts.SyntaxKind.ExclamationEqualsToken, // != (loose) ts.factory.createNull() ), undefined, @@ -313,41 +328,45 @@ export class ZodFormat implements SerializationFormat { /** * Creates a toJsonExpression for objects that recursively transforms properties needing serialization. * - * COMPLEXITY: O(n) where n = number of properties at each level with transforms. - * The spread operator copies all properties, even unchanged ones, at each level on the path - * to a property requiring transformation (e.g., Set → Array). - * - * POTENTIAL IMPROVEMENTS (follow-up work): - * 1. Persistent data structures (HAMT/Immutable.js): O(log n) updates with structural sharing, - * but requires changing the entire data model and adds ~50KB bundle size. - * 2. Lazy/Proxy-based transforms: Defer transformation until JSON.stringify, achieving O(k) - * where k = properties actually serialized. Adds runtime complexity. - * 3. Surgical Object.assign: Minor constant-factor improvement, same O(n) complexity. - * - * For typical API payloads (< 100 properties), current O(n) is acceptable. + * When property keys differ between raw/parsed (e.g., NestedObject vs nestedObject), + * we must explicitly map ALL properties to avoid having both keys in the output. */ + const hasKeyRenaming = properties.some((p) => p.key.raw !== p.key.parsed); const createObjectJsonExpression = (parsed: ts.Expression): ts.Expression => { - if (propsWithJsonTransform.length === 0) { + if (propsWithJsonTransform.length === 0 && !hasKeyRenaming) { return parsed; // No transform needed - O(1) } - // Generate: { ...parsed, propName: Array.from(parsed.propName), ... } - // This spreads all properties (O(n)) then overwrites transformed ones - const propAssignments: ts.ObjectLiteralElementLike[] = [ - ts.factory.createSpreadAssignment(parsed) - ]; - for (const prop of propsWithJsonTransform) { + + // If there's key renaming OR transforms, we must explicitly map all properties + // to ensure correct key names and proper serialization + const propAssignments: ts.ObjectLiteralElementLike[] = properties.map((prop) => { const propSchema = prop.value as ZodBaseSchema; + const propAccess = ts.factory.createPropertyAccessExpression(parsed, prop.key.parsed); + + // If this property has a toJsonExpression, use it if (propSchema.toJsonExpression) { - propAssignments.push( - ts.factory.createPropertyAssignment( - prop.key.raw, // Use raw key for wire format - propSchema.toJsonExpression( - ts.factory.createPropertyAccessExpression(parsed, prop.key.parsed) - ) - ) - ); + // If property is optional or nullable, wrap with null check + const transformExpr = + propSchema.isOptional || propSchema.isNullable + ? ts.factory.createConditionalExpression( + ts.factory.createBinaryExpression( + propAccess, + ts.SyntaxKind.ExclamationEqualsToken, // != (loose) + ts.factory.createNull() + ), + undefined, + propSchema.toJsonExpression(propAccess), + undefined, + propAccess + ) + : propSchema.toJsonExpression(propAccess); + return ts.factory.createPropertyAssignment(prop.key.raw, transformExpr); } - } + + // No transform needed - just map the key + return ts.factory.createPropertyAssignment(prop.key.raw, propAccess); + }); + return ts.factory.createObjectLiteralExpression(propAssignments, true); }; @@ -367,13 +386,13 @@ export class ZodFormat implements SerializationFormat { return this.zodCall("object", [ts.factory.createObjectLiteralExpression(propAssignments, true)]); }, + // Need toJsonExpression if there are transforms OR key renamings toJsonExpression: - propsWithJsonTransform.length > 0 ? createObjectJsonExpression : undefined + propsWithJsonTransform.length > 0 || hasKeyRenaming ? createObjectJsonExpression : undefined }; - // If any properties have different raw/parsed keys, wrap with transform - const needsTransform = properties.some((p) => p.key.raw !== p.key.parsed); - if (needsTransform) { + // If any properties have different raw/parsed keys, wrap with transform for parsing + if (hasKeyRenaming) { const transformedBase: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -400,8 +419,9 @@ export class ZodFormat implements SerializationFormat { ); return chainMethod(inner, "transform", [transformExpr]); }, + // Need toJsonExpression if there are transforms OR key renamings toJsonExpression: - propsWithJsonTransform.length > 0 ? createObjectJsonExpression : undefined + propsWithJsonTransform.length > 0 || hasKeyRenaming ? createObjectJsonExpression : undefined }; return { ...transformedBase, @@ -536,7 +556,25 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => this.zodCall("array", [itemSchema.toExpression()]) + toExpression: () => this.zodCall("array", [itemSchema.toExpression()]), + // If items need serialization, map over array and serialize each item + toJsonExpression: itemSchema.toJsonExpression + ? (parsed) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(parsed, "map"), + undefined, + [ + ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "item")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + itemSchema.toJsonExpression!(ts.factory.createIdentifier("item")) + ) + ] + ) + : undefined }; return { @@ -548,7 +586,7 @@ export class ZodFormat implements SerializationFormat { public set = (itemSchema: Schema): SchemaWithUtils => { // JSON wire format uses arrays for sets // Parsing: z.array().transform(arr => new Set(arr)) converts array → Set - // Serialization: Array.from() converts Set → Array + // Serialization: Array.from() converts Set → Array (with item serialization if needed) const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -567,13 +605,41 @@ export class ZodFormat implements SerializationFormat { ); return chainMethod(arraySchema, "transform", [transformFn]); }, - // For JSON serialization, convert Set to Array: Array.from(value) - toJsonExpression: (parsed) => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier("Array"), "from"), - undefined, - [parsed] - ) + // For JSON serialization, convert Set to Array + // If items need serialization, map over them: Array.from(set).map(item => item.json(item)) + // Otherwise just: Array.from(set) + toJsonExpression: itemSchema.toJsonExpression + ? (parsed) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("Array"), + "from" + ), + undefined, + [parsed] + ), + "map" + ), + undefined, + [ + ts.factory.createArrowFunction( + undefined, + undefined, + [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "item")], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + itemSchema.toJsonExpression!(ts.factory.createIdentifier("item")) + ) + ] + ) + : (parsed) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier("Array"), "from"), + undefined, + [parsed] + ) }; return { @@ -594,7 +660,57 @@ export class ZodFormat implements SerializationFormat { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => this.zodCall("record", [this.zodCall("string"), valueSchema.toExpression()]) + toExpression: () => this.zodCall("record", [this.zodCall("string"), valueSchema.toExpression()]), + // If values need serialization, transform each value in the record + toJsonExpression: valueSchema.toJsonExpression + ? (parsed) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("Object"), + "fromEntries" + ), + undefined, + [ + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("Object"), + "entries" + ), + undefined, + [parsed] + ), + "map" + ), + undefined, + [ + ts.factory.createArrowFunction( + undefined, + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + ts.factory.createArrayBindingPattern([ + ts.factory.createBindingElement(undefined, undefined, "k"), + ts.factory.createBindingElement(undefined, undefined, "v") + ]) + ) + ], + undefined, + ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + ts.factory.createArrayLiteralExpression([ + ts.factory.createIdentifier("k"), + valueSchema.toJsonExpression!(ts.factory.createIdentifier("v")) + ]) + ) + ] + ) + ] + ) + : undefined }; return { @@ -724,7 +840,14 @@ export class ZodFormat implements SerializationFormat { ]) ) ]); - } + }, + // For JSON serialization, convert Date back to ISO string: date.toISOString() + toJsonExpression: (parsed) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(parsed, "toISOString"), + undefined, + [] + ) }; return { @@ -825,22 +948,82 @@ export class ZodFormat implements SerializationFormat { // ==================== Type Utilities ==================== public Schema = { - _getReferenceToType: (_args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { - // Use z.ZodTypeAny to avoid type inference issues with transforms (ZodEffects) - // The parsed/raw shapes are not used because Zod's strict inference doesn't work - // well with discriminated unions and transforms that rename properties + _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + // Generate a type literal that matches the wrapper object structure: + // { _schema: z.ZodTypeAny; parse: (raw: unknown) => Parsed; json: (parsed: Parsed) => Raw } this.ensureZodImport(); - return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodTypeAny"), - undefined - ); + return ts.factory.createTypeLiteralNode([ + // _schema: z.ZodTypeAny + ts.factory.createPropertySignature( + undefined, + "_schema", + undefined, + ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodTypeAny"), + undefined + ) + ), + // parse: (raw: unknown) => Parsed + ts.factory.createPropertySignature( + undefined, + "parse", + undefined, + ts.factory.createFunctionTypeNode( + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + "raw", + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword) + ) + ], + parsedShape + ) + ), + // json: (parsed: Parsed) => Raw + ts.factory.createPropertySignature( + undefined, + "json", + undefined, + ts.factory.createFunctionTypeNode( + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + "parsed", + undefined, + parsedShape + ) + ], + rawShape + ) + ) + ]); }, _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SchemaWithUtils => { + // For Zod format, schemas are wrapped with { _schema, parse, json } structure + // When used in schema composition (z.array, z.record, etc.), we need the actual Zod schema + // When serializing, we call the wrapper's .json() method const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => expression + // Return expression._schema for use in schema composition (z.array(), z.record(), etc.) + toExpression: () => + ts.factory.createPropertyAccessExpression(expression, "_schema"), + // Generate: schemaRef.json(parsed) for serialization + // This calls the json method on the wrapper object generated in writeSchemaToFile + toJsonExpression: (parsed) => + ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(expression, "json"), + undefined, + [parsed] + ) }; if (opts?.isObject) { return { @@ -882,13 +1065,61 @@ export class ZodFormat implements SerializationFormat { }; public ObjectSchema = { - _getReferenceToType: (_args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { - // Use z.ZodTypeAny to avoid type inference issues with transforms (ZodEffects) + _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + // Generate same wrapper type as Schema - objects use the same structure this.ensureZodImport(); - return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodTypeAny"), - undefined - ); + return ts.factory.createTypeLiteralNode([ + // _schema: z.ZodTypeAny + ts.factory.createPropertySignature( + undefined, + "_schema", + undefined, + ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName(ts.factory.createIdentifier("z"), "ZodTypeAny"), + undefined + ) + ), + // parse: (raw: unknown) => Parsed + ts.factory.createPropertySignature( + undefined, + "parse", + undefined, + ts.factory.createFunctionTypeNode( + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + "raw", + undefined, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword) + ) + ], + parsedShape + ) + ), + // json: (parsed: Parsed) => Raw + ts.factory.createPropertySignature( + undefined, + "json", + undefined, + ts.factory.createFunctionTypeNode( + undefined, + [ + ts.factory.createParameterDeclaration( + undefined, + undefined, + undefined, + "parsed", + undefined, + parsedShape + ) + ], + rawShape + ) + ) + ]); } }; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index 3b8013cbeb75..c8c91181c2e2 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -16,7 +16,7 @@ import { } from "../SerializationFormat"; /** - * Manifest for the Zurg runtime files + * Manifest for the Zurg runtime files. */ export const ZURG_MANIFEST: CoreUtility.Manifest = { name: "schemas", diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts index c0baf9ea476d..65bf08dc772d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts @@ -57,7 +57,7 @@ export class ContainerClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -66,7 +66,9 @@ export class ContainerClient { }); if (_response.ok) { return { - data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response.parse(_response.body), + data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response._schema.parse( + _response.body, + ), rawResponse: _response.rawResponse, }; } @@ -126,7 +128,7 @@ export class ContainerClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.container.getAndReturnListOfObjects.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -135,7 +137,7 @@ export class ContainerClient { }); if (_response.ok) { return { - data: serializers.endpoints.container.getAndReturnListOfObjects.Response.parse(_response.body), + data: serializers.endpoints.container.getAndReturnListOfObjects.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -186,7 +188,7 @@ export class ContainerClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -195,7 +197,9 @@ export class ContainerClient { }); if (_response.ok) { return { - data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.parse(_response.body), + data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response._schema.parse( + _response.body, + ), rawResponse: _response.rawResponse, }; } @@ -248,7 +252,7 @@ export class ContainerClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -257,7 +261,7 @@ export class ContainerClient { }); if (_response.ok) { return { - data: serializers.endpoints.container.getAndReturnSetOfObjects.Response.parse(_response.body), + data: serializers.endpoints.container.getAndReturnSetOfObjects.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -310,7 +314,7 @@ export class ContainerClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -319,7 +323,7 @@ export class ContainerClient { }); if (_response.ok) { return { - data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.parse(_response.body), + data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -374,7 +378,7 @@ export class ContainerClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -383,7 +387,9 @@ export class ContainerClient { }); if (_response.ok) { return { - data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.parse(_response.body), + data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response._schema.parse( + _response.body, + ), rawResponse: _response.rawResponse, }; } @@ -441,7 +447,10 @@ export class ContainerClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request != null ? request : undefined, + body: + request != null + ? serializers.endpoints.container.getAndReturnOptional.Request.json(request) + : undefined, timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -450,7 +459,7 @@ export class ContainerClient { }); if (_response.ok) { return { - data: serializers.endpoints.container.getAndReturnOptional.Response.parse(_response.body), + data: serializers.endpoints.container.getAndReturnOptional.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts index 361c0fee01c9..920acc7a8a7e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -6,6 +6,7 @@ import { mergeHeaders } from "../../../../../../core/headers.js"; import * as core from "../../../../../../core/index.js"; import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; import type * as SeedExhaustive from "../../../../../index.js"; export declare namespace ContentTypeClient { @@ -72,7 +73,7 @@ export class ContentTypeClient { contentType: "application/json-patch+json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithOptionalField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -147,7 +148,7 @@ export class ContentTypeClient { contentType: "application/json-patch+json; charset=utf-8", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithOptionalField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts index 74c54017a8c9..befd4eb2fe7b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -57,7 +57,7 @@ export class EnumClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.WeatherReport.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -65,7 +65,10 @@ export class EnumClient { logging: this._options.logging, }); if (_response.ok) { - return { data: serializers.types.WeatherReport.parse(_response.body), rawResponse: _response.rawResponse }; + return { + data: serializers.types.WeatherReport._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; } if (_response.error.reason === "status-code") { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts index 489b113dc93a..26cd0aef2380 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -60,7 +60,7 @@ export class HttpMethodsClient { }); if (_response.ok) { return { - data: serializers.endpoints.httpMethods.testGet.Response.parse(_response.body), + data: serializers.endpoints.httpMethods.testGet.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -113,7 +113,7 @@ export class HttpMethodsClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithRequiredField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -122,7 +122,7 @@ export class HttpMethodsClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithOptionalField.parse(_response.body), + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -178,7 +178,7 @@ export class HttpMethodsClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithRequiredField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -187,7 +187,7 @@ export class HttpMethodsClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithOptionalField.parse(_response.body), + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -257,7 +257,7 @@ export class HttpMethodsClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithOptionalField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -266,7 +266,7 @@ export class HttpMethodsClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithOptionalField.parse(_response.body), + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -323,7 +323,7 @@ export class HttpMethodsClient { }); if (_response.ok) { return { - data: serializers.endpoints.httpMethods.testDelete.Response.parse(_response.body), + data: serializers.endpoints.httpMethods.testDelete.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts index def6861d9cd1..977107bd4917 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts @@ -73,7 +73,7 @@ export class ObjectClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithOptionalField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -82,7 +82,7 @@ export class ObjectClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithOptionalField.parse(_response.body), + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -140,7 +140,7 @@ export class ObjectClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithRequiredField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -149,7 +149,7 @@ export class ObjectClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithRequiredField.parse(_response.body), + data: serializers.types.ObjectWithRequiredField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -211,7 +211,7 @@ export class ObjectClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.ObjectWithMapOfMap.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -220,7 +220,7 @@ export class ObjectClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithMapOfMap.parse(_response.body), + data: serializers.types.ObjectWithMapOfMap._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -297,7 +297,7 @@ export class ObjectClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.NestedObjectWithOptionalField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -306,7 +306,7 @@ export class ObjectClient { }); if (_response.ok) { return { - data: serializers.types.NestedObjectWithOptionalField.parse(_response.body), + data: serializers.types.NestedObjectWithOptionalField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -386,7 +386,7 @@ export class ObjectClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.NestedObjectWithRequiredField.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -395,7 +395,7 @@ export class ObjectClient { }); if (_response.ok) { return { - data: serializers.types.NestedObjectWithRequiredField.parse(_response.body), + data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -491,7 +491,7 @@ export class ObjectClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -500,7 +500,7 @@ export class ObjectClient { }); if (_response.ok) { return { - data: serializers.types.NestedObjectWithRequiredField.parse(_response.body), + data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts index 0e3fc1743459..3a81c10c657f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts @@ -62,7 +62,7 @@ export class ParamsClient { }); if (_response.ok) { return { - data: serializers.endpoints.params.getWithPath.Response.parse(_response.body), + data: serializers.endpoints.params.getWithPath.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -124,7 +124,7 @@ export class ParamsClient { }); if (_response.ok) { return { - data: serializers.endpoints.params.getWithInlinePath.Response.parse(_response.body), + data: serializers.endpoints.params.getWithInlinePath.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -442,7 +442,7 @@ export class ParamsClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.params.modifyWithPath.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -451,7 +451,7 @@ export class ParamsClient { }); if (_response.ok) { return { - data: serializers.endpoints.params.modifyWithPath.Response.parse(_response.body), + data: serializers.endpoints.params.modifyWithPath.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -508,7 +508,7 @@ export class ParamsClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: _body, + body: serializers.endpoints.params.modifyWithInlinePath.Request.json(_body), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -517,7 +517,7 @@ export class ParamsClient { }); if (_response.ok) { return { - data: serializers.endpoints.params.modifyWithInlinePath.Response.parse(_response.body), + data: serializers.endpoints.params.modifyWithInlinePath.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts index 7b08ff318060..60ef815dc211 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -56,7 +56,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnString.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -65,7 +65,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnString.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnString.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -116,7 +116,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnInt.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -125,7 +125,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnInt.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnInt.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -176,7 +176,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnLong.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -185,7 +185,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnLong.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnLong.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -236,7 +236,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnDouble.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -245,7 +245,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnDouble.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnDouble.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -296,7 +296,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnBool.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -305,7 +305,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnBool.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnBool.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -356,7 +356,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnDatetime.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -365,7 +365,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnDatetime.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnDatetime.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -416,7 +416,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnDate.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -425,7 +425,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnDate.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnDate.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -476,7 +476,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnUuid.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -485,7 +485,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnUuid.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnUuid.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -536,7 +536,7 @@ export class PrimitiveClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.endpoints.primitive.getAndReturnBase64.Request.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -545,7 +545,7 @@ export class PrimitiveClient { }); if (_response.ok) { return { - data: serializers.endpoints.primitive.getAndReturnBase64.Response.parse(_response.body), + data: serializers.endpoints.primitive.getAndReturnBase64.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts index b968821f2452..6a89a9bc090e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts @@ -66,7 +66,7 @@ export class PutClient { }); if (_response.ok) { return { - data: serializers.endpoints.PutResponse.parse(_response.body), + data: serializers.endpoints.PutResponse._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts index 6edc8390b8bc..95f732c131d8 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts @@ -61,7 +61,7 @@ export class UnionClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.types.Animal.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -69,7 +69,7 @@ export class UnionClient { logging: this._options.logging, }); if (_response.ok) { - return { data: serializers.types.Animal.parse(_response.body), rawResponse: _response.rawResponse }; + return { data: serializers.types.Animal._schema.parse(_response.body), rawResponse: _response.rawResponse }; } if (_response.error.reason === "status-code") { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts index eb85e22bde0a..c9401e289700 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -55,7 +55,7 @@ export class UrlsClient { }); if (_response.ok) { return { - data: serializers.endpoints.urls.withMixedCase.Response.parse(_response.body), + data: serializers.endpoints.urls.withMixedCase.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -105,7 +105,7 @@ export class UrlsClient { }); if (_response.ok) { return { - data: serializers.endpoints.urls.noEndingSlash.Response.parse(_response.body), + data: serializers.endpoints.urls.noEndingSlash.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -155,7 +155,7 @@ export class UrlsClient { }); if (_response.ok) { return { - data: serializers.endpoints.urls.withEndingSlash.Response.parse(_response.body), + data: serializers.endpoints.urls.withEndingSlash.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -205,7 +205,7 @@ export class UrlsClient { }); if (_response.ok) { return { - data: serializers.endpoints.urls.withUnderscores.Response.parse(_response.body), + data: serializers.endpoints.urls.withUnderscores.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts index a3510e8330e0..dcf128fe3b72 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts @@ -76,7 +76,7 @@ export class InlinedRequestsClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: request, + body: serializers.PostWithObjectBody.json(request), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, @@ -85,7 +85,7 @@ export class InlinedRequestsClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithOptionalField.parse(_response.body), + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -94,7 +94,7 @@ export class InlinedRequestsClient { switch (_response.error.statusCode) { case 400: throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo.parse(_response.error.body), + serializers.BadObjectRequestInfo._schema.parse(_response.error.body), _response.rawResponse, ); default: diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts index 6a13bf7af0d4..282d68aa3b53 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts @@ -67,7 +67,7 @@ export class NoAuthClient { }); if (_response.ok) { return { - data: serializers.noAuth.postWithNoAuth.Response.parse(_response.body), + data: serializers.noAuth.postWithNoAuth.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -76,7 +76,7 @@ export class NoAuthClient { switch (_response.error.statusCode) { case 400: throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo.parse(_response.error.body), + serializers.BadObjectRequestInfo._schema.parse(_response.error.body), _response.rawResponse, ); default: diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts index 7c2f33d1ea28..6eea09ec1f67 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts @@ -60,7 +60,7 @@ export class NoReqBodyClient { }); if (_response.ok) { return { - data: serializers.types.ObjectWithOptionalField.parse(_response.body), + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } @@ -112,7 +112,7 @@ export class NoReqBodyClient { }); if (_response.ok) { return { - data: serializers.noReqBody.postWithNoRequestBody.Response.parse(_response.body), + data: serializers.noReqBody.postWithNoRequestBody.Response._schema.parse(_response.body), rawResponse: _response.rawResponse, }; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts index 2d241aeaa762..5cf55b3b4c66 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts @@ -6,6 +6,7 @@ import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers. import * as core from "../../../../core/index.js"; import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; import type * as SeedExhaustive from "../../../index.js"; export declare namespace ReqWithHeadersClient { @@ -65,7 +66,7 @@ export class ReqWithHeadersClient { contentType: "application/json", queryParameters: requestOptions?.queryParams, requestType: "json", - body: _body, + body: serializers.reqWithHeaders.getWithCustomHeader.Request.json(_body), timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, abortSignal: requestOptions?.abortSignal, diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts index 5f75410634ad..3e5dc038a0ae 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -1,15 +1,45 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodTypeAny = z.array(ObjectWithRequiredField); +const _Request_Schema = z.array(ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, +}; export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: z.ZodTypeAny = z.array(ObjectWithRequiredField); +const _Response_Schema = z.array(ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, +}; export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts index 0ef52f69076f..d5c3cd1ae608 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.array(z.string()); +const _Request_Schema = z.array(z.string()); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string[]; + json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string[], + json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, +}; export declare namespace Request { export type Raw = string[]; } -export const Response: z.ZodTypeAny = z.array(z.string()); +const _Response_Schema = z.array(z.string()); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string[]; + json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string[], + json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, +}; export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts index c42e474a152f..000bdb1a9f9a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -1,15 +1,46 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodTypeAny = z.record(z.string(), ObjectWithRequiredField); +const _Request_Schema = z.record(z.string(), ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: ( + parsed: Record, + ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, + json: (parsed: Record) => + Object.fromEntries( + Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), + ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, +}; export declare namespace Request { export type Raw = Record; } -export const Response: z.ZodTypeAny = z.record(z.string(), ObjectWithRequiredField); +const _Response_Schema = z.record(z.string(), ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: ( + parsed: Record, + ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => + _Response_Schema.parse(raw) as Record, + json: (parsed: Record) => + Object.fromEntries( + Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), + ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, +}; export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts index c04e11d33ce6..f5db8ef1efae 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -1,14 +1,35 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.record(z.string(), z.string()); +const _Request_Schema = z.record(z.string(), z.string()); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, + json: (parsed: Record) => + parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, +}; export declare namespace Request { export type Raw = Record; } -export const Response: z.ZodTypeAny = z.record(z.string(), z.string()); +const _Response_Schema = z.record(z.string(), z.string()); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Record, + json: (parsed: Record) => + parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, +}; export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts index deb15ce95797..fb36dd017dc2 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -1,15 +1,45 @@ // This file was auto-generated by Fern from our API Definition. import type { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodTypeAny = ObjectWithRequiredField.optional(); +const _Request_Schema = ObjectWithRequiredField._schema.optional(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, + ) => serializers.endpoints.container.getAndReturnOptional.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => + parsed != null + ? ObjectWithRequiredField.json(parsed) + : (parsed as serializers.endpoints.container.getAndReturnOptional.Request.Raw), +}; export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw | null | undefined; } -export const Response: z.ZodTypeAny = ObjectWithRequiredField.optional(); +const _Response_Schema = ObjectWithRequiredField._schema.optional(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, + ) => serializers.endpoints.container.getAndReturnOptional.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => + parsed != null + ? ObjectWithRequiredField.json(parsed) + : (parsed as serializers.endpoints.container.getAndReturnOptional.Response.Raw), +}; export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw | null | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts index 5f75410634ad..0c85a32c4a09 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -1,15 +1,45 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: z.ZodTypeAny = z.array(ObjectWithRequiredField); +const _Request_Schema = z.array(ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, +}; export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: z.ZodTypeAny = z.array(ObjectWithRequiredField); +const _Response_Schema = z.array(ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, +}; export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts index 5aeb5eb7b7cd..f80628d1136e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -1,14 +1,35 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.array(z.string()).transform((arr) => new Set(arr)); +const _Request_Schema = z.array(z.string()).transform((arr) => new Set(arr)); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Set; + json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Set, + json: (parsed: Set) => + Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, +}; export declare namespace Request { export type Raw = string[]; } -export const Response: z.ZodTypeAny = z.array(z.string()).transform((arr) => new Set(arr)); +const _Response_Schema = z.array(z.string()).transform((arr) => new Set(arr)); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Set; + json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Set, + json: (parsed: Set) => + Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, +}; export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts index 79e0615b9086..f770bb3d0434 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.boolean(); +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.httpMethods.testDelete.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.httpMethods.testDelete.Response.Raw, +}; export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts index 4d16f644374f..ee29c6d64e90 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.httpMethods.testGet.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.httpMethods.testGet.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts index 6abdb01c2536..2ffc5ec115c4 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -1,9 +1,25 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; -export const Request: z.ZodTypeAny = z.array(NestedObjectWithRequiredField); +const _Request_Schema = z.array(NestedObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithRequiredField[], + ) => serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField[]) => + parsed.map((item) => + NestedObjectWithRequiredField.json(item), + ) as serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, +}; export declare namespace Request { export type Raw = NestedObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts index 4d16f644374f..62d66628879c 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.getWithInlinePath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.getWithInlinePath.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts index 4d16f644374f..28e0a88b1335 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.getWithPath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.getWithPath.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts index d89fd639a0e9..920948641520 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.string(); +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Request.Raw, +}; export declare namespace Request { export type Raw = string; } -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts index d89fd639a0e9..f2004c062f3b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.string(); +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Request.Raw, +}; export declare namespace Request { export type Raw = string; } -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts index d89fd639a0e9..7761ce306fe3 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.string(); +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, +}; export declare namespace Request { export type Raw = string; } -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts index b2514975ed69..ea9575e1ce1e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.boolean(); +const _Request_Schema = z.boolean(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Request.Raw, +}; export declare namespace Request { export type Raw = boolean; } -export const Response: z.ZodTypeAny = z.boolean(); +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Response.Raw, +}; export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts index d89fd639a0e9..52cc217d53a2 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.string(); +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Request.Raw, +}; export declare namespace Request { export type Raw = string; } -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts index 1f5ec890abaa..337a002320dc 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.string().transform((s) => new Date(s)); +const _Request_Schema = z.string().transform((s) => new Date(s)); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Date; + json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Date, + json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, +}; export declare namespace Request { export type Raw = string; } -export const Response: z.ZodTypeAny = z.string().transform((s) => new Date(s)); +const _Response_Schema = z.string().transform((s) => new Date(s)); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Date; + json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Date, + json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts index fa773ba5afd7..b04a1153d28b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.number(); +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, +}; export declare namespace Request { export type Raw = number; } -export const Response: z.ZodTypeAny = z.number(); +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, +}; export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts index fa773ba5afd7..40b6b5b97418 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.number(); +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Request.Raw, +}; export declare namespace Request { export type Raw = number; } -export const Response: z.ZodTypeAny = z.number(); +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Response.Raw, +}; export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts index fa773ba5afd7..0fc1f2cdff59 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.number(); +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Request.Raw, +}; export declare namespace Request { export type Raw = number; } -export const Response: z.ZodTypeAny = z.number(); +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Response.Raw, +}; export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts index d89fd639a0e9..ec9d5995de47 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.string(); +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Request.Raw, +}; export declare namespace Request { export type Raw = string; } -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts index d89fd639a0e9..7f5c79800271 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -1,14 +1,33 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Request: z.ZodTypeAny = z.string(); +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Request.Raw, +}; export declare namespace Request { export type Raw = string; } -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts index 6c67652cba7f..fda956fe3da3 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -1,8 +1,19 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const ErrorCategory: z.ZodTypeAny = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +const _ErrorCategory_Schema = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +export const ErrorCategory: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCategory; + json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => serializers.endpoints.ErrorCategory.Raw; +} = { + _schema: _ErrorCategory_Schema, + parse: (raw: unknown) => _ErrorCategory_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCategory, + json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => parsed as serializers.endpoints.ErrorCategory.Raw, +}; export declare namespace ErrorCategory { export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts index 539a81e75f62..0daa10ba1c93 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -1,8 +1,10 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const ErrorCode: z.ZodTypeAny = z.enum([ +const _ErrorCode_Schema = z.enum([ "INTERNAL_SERVER_ERROR", "UNAUTHORIZED", "FORBIDDEN", @@ -15,6 +17,15 @@ export const ErrorCode: z.ZodTypeAny = z.enum([ "SERVICE_UNAVAILABLE", "Unknown", ]); +export const ErrorCode: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCode; + json: (parsed: SeedExhaustive.endpoints.ErrorCode) => serializers.endpoints.ErrorCode.Raw; +} = { + _schema: _ErrorCode_Schema, + parse: (raw: unknown) => _ErrorCode_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCode, + json: (parsed: SeedExhaustive.endpoints.ErrorCode) => parsed as serializers.endpoints.ErrorCode.Raw, +}; export declare namespace ErrorCode { export type Raw = diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts index ddb93a2d85f0..917889e06380 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -1,15 +1,32 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { ErrorCategory } from "./ErrorCategory.js"; import { ErrorCode } from "./ErrorCode.js"; -export const Error_: z.ZodTypeAny = z.object({ - category: ErrorCategory, - code: ErrorCode, +const _Error__Schema = z.object({ + category: ErrorCategory._schema, + code: ErrorCode._schema, detail: z.string().optional(), field: z.string().optional(), }); +export const Error_: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.Error_; + json: (parsed: SeedExhaustive.endpoints.Error_) => serializers.endpoints.Error_.Raw; +} = { + _schema: _Error__Schema, + parse: (raw: unknown) => _Error__Schema.parse(raw) as SeedExhaustive.endpoints.Error_, + json: (parsed: SeedExhaustive.endpoints.Error_) => + ({ + category: ErrorCategory.json(parsed.category), + code: ErrorCode.json(parsed.code), + detail: parsed.detail, + field: parsed.field, + }) as serializers.endpoints.Error_.Raw, +}; export declare namespace Error_ { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts index 645a31bd52e6..520e6cfb62b7 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -1,11 +1,30 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { Error_ } from "./Error_.js"; -export const PutResponse: z.ZodTypeAny = z.object({ - errors: z.array(Error_).optional(), +const _PutResponse_Schema = z.object({ + errors: z.array(Error_._schema).optional(), }); +export const PutResponse: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.PutResponse; + json: (parsed: SeedExhaustive.endpoints.PutResponse) => serializers.endpoints.PutResponse.Raw; +} = { + _schema: _PutResponse_Schema, + parse: (raw: unknown) => _PutResponse_Schema.parse(raw) as SeedExhaustive.endpoints.PutResponse, + json: (parsed: SeedExhaustive.endpoints.PutResponse) => + ({ + errors: + parsed.errors != null + ? parsed.errors != null + ? parsed.errors.map((item) => Error_.json(item)) + : parsed.errors + : parsed.errors, + }) as serializers.endpoints.PutResponse.Raw, +}; export declare namespace PutResponse { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts index 4d16f644374f..792cdff843dd 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.noEndingSlash.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.noEndingSlash.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts index 4d16f644374f..05918aed9575 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withEndingSlash.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withEndingSlash.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts index 4d16f644374f..ef6df73d7ec0 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withMixedCase.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withMixedCase.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts index 4d16f644374f..3e792cbc8530 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withUnderscores.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withUnderscores.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts index 562ead36ec61..f7a345d3368a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -1,10 +1,21 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../api/index.js"; +import type * as serializers from "../../../index.js"; -export const BadObjectRequestInfo: z.ZodTypeAny = z.object({ +const _BadObjectRequestInfo_Schema = z.object({ message: z.string(), }); +export const BadObjectRequestInfo: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.BadObjectRequestInfo; + json: (parsed: SeedExhaustive.BadObjectRequestInfo) => serializers.BadObjectRequestInfo.Raw; +} = { + _schema: _BadObjectRequestInfo_Schema, + parse: (raw: unknown) => _BadObjectRequestInfo_Schema.parse(raw) as SeedExhaustive.BadObjectRequestInfo, + json: (parsed: SeedExhaustive.BadObjectRequestInfo) => parsed as serializers.BadObjectRequestInfo.Raw, +}; export declare namespace BadObjectRequestInfo { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts index a3fded466e98..afdc575ededd 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -1,19 +1,35 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../api/index.js"; +import type * as serializers from "../../../../index.js"; import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; -export const PostWithObjectBody: z.ZodTypeAny = z +const _PostWithObjectBody_Schema = z .object({ string: z.string(), integer: z.number(), - NestedObject: ObjectWithOptionalField, + NestedObject: ObjectWithOptionalField._schema, }) .transform((data) => ({ string: data.string, integer: data.integer, nestedObject: data.NestedObject, })); +export const PostWithObjectBody: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.PostWithObjectBody; + json: (parsed: SeedExhaustive.PostWithObjectBody) => serializers.PostWithObjectBody.Raw; +} = { + _schema: _PostWithObjectBody_Schema, + parse: (raw: unknown) => _PostWithObjectBody_Schema.parse(raw) as SeedExhaustive.PostWithObjectBody, + json: (parsed: SeedExhaustive.PostWithObjectBody) => + ({ + string: parsed.string, + integer: parsed.integer, + NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), + }) as serializers.PostWithObjectBody.Raw, +}; export declare namespace PostWithObjectBody { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts index 79e0615b9086..7c8d3bf63cc1 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../index.js"; -export const Response: z.ZodTypeAny = z.boolean(); +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.noAuth.postWithNoAuth.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.noAuth.postWithNoAuth.Response.Raw, +}; export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts index 4d16f644374f..5880dd1a7111 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../index.js"; -export const Response: z.ZodTypeAny = z.string(); +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.noReqBody.postWithNoRequestBody.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.noReqBody.postWithNoRequestBody.Response.Raw, +}; export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts index 6d9175922020..f3d5598805ba 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -1,8 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as serializers from "../../../index.js"; -export const Request: z.ZodTypeAny = z.string(); +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.reqWithHeaders.getWithCustomHeader.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.reqWithHeaders.getWithCustomHeader.Request.Raw, +}; export declare namespace Request { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts index df2265b7d957..fda1be806c19 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -1,10 +1,21 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const ObjectWithDocs: z.ZodTypeAny = z.object({ +const _ObjectWithDocs_Schema = z.object({ string: z.string(), }); +export const ObjectWithDocs: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithDocs; + json: (parsed: SeedExhaustive.types.ObjectWithDocs) => serializers.types.ObjectWithDocs.Raw; +} = { + _schema: _ObjectWithDocs_Schema, + parse: (raw: unknown) => _ObjectWithDocs_Schema.parse(raw) as SeedExhaustive.types.ObjectWithDocs, + json: (parsed: SeedExhaustive.types.ObjectWithDocs) => parsed as serializers.types.ObjectWithDocs.Raw, +}; export declare namespace ObjectWithDocs { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts index 61a2d8e15121..feebc1f6a916 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -1,8 +1,19 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const WeatherReport: z.ZodTypeAny = z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +const _WeatherReport_Schema = z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +export const WeatherReport: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.WeatherReport; + json: (parsed: SeedExhaustive.types.WeatherReport) => serializers.types.WeatherReport.Raw; +} = { + _schema: _WeatherReport_Schema, + parse: (raw: unknown) => _WeatherReport_Schema.parse(raw) as SeedExhaustive.types.WeatherReport, + json: (parsed: SeedExhaustive.types.WeatherReport) => parsed as serializers.types.WeatherReport.Raw, +}; export declare namespace WeatherReport { export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts index 02718a049540..a68dc56bdfba 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -1,11 +1,30 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { OptionalAlias } from "./OptionalAlias.js"; -export const DoubleOptional: z.ZodTypeAny = z.object({ - optionalAlias: OptionalAlias.optional(), +const _DoubleOptional_Schema = z.object({ + optionalAlias: OptionalAlias._schema.optional(), }); +export const DoubleOptional: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.DoubleOptional; + json: (parsed: SeedExhaustive.types.DoubleOptional) => serializers.types.DoubleOptional.Raw; +} = { + _schema: _DoubleOptional_Schema, + parse: (raw: unknown) => _DoubleOptional_Schema.parse(raw) as SeedExhaustive.types.DoubleOptional, + json: (parsed: SeedExhaustive.types.DoubleOptional) => + ({ + optionalAlias: + parsed.optionalAlias != null + ? parsed.optionalAlias != null + ? OptionalAlias.json(parsed.optionalAlias) + : parsed.optionalAlias + : parsed.optionalAlias, + }) as serializers.types.DoubleOptional.Raw, +}; export declare namespace DoubleOptional { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts index 9845d814508f..c90be8618d11 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -1,17 +1,40 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithOptionalField: z.ZodTypeAny = z +const _NestedObjectWithOptionalField_Schema = z .object({ string: z.string().optional(), - NestedObject: ObjectWithOptionalField.optional(), + NestedObject: ObjectWithOptionalField._schema.optional(), }) .transform((data) => ({ string: data.string, nestedObject: data.NestedObject, })); +export const NestedObjectWithOptionalField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithOptionalField; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithOptionalField, + ) => serializers.types.NestedObjectWithOptionalField.Raw; +} = { + _schema: _NestedObjectWithOptionalField_Schema, + parse: (raw: unknown) => + _NestedObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithOptionalField, + json: (parsed: SeedExhaustive.types.NestedObjectWithOptionalField) => + ({ + string: parsed.string, + NestedObject: + parsed.nestedObject != null + ? parsed.nestedObject != null + ? ObjectWithOptionalField.json(parsed.nestedObject) + : parsed.nestedObject + : parsed.nestedObject, + }) as serializers.types.NestedObjectWithOptionalField.Raw, +}; export declare namespace NestedObjectWithOptionalField { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts index f91bcd50dcde..ef7b8353d527 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -1,17 +1,35 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithRequiredField: z.ZodTypeAny = z +const _NestedObjectWithRequiredField_Schema = z .object({ string: z.string(), - NestedObject: ObjectWithOptionalField, + NestedObject: ObjectWithOptionalField._schema, }) .transform((data) => ({ string: data.string, nestedObject: data.NestedObject, })); +export const NestedObjectWithRequiredField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithRequiredField, + ) => serializers.types.NestedObjectWithRequiredField.Raw; +} = { + _schema: _NestedObjectWithRequiredField_Schema, + parse: (raw: unknown) => + _NestedObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField, + json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField) => + ({ + string: parsed.string, + NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), + }) as serializers.types.NestedObjectWithRequiredField.Raw, +}; export declare namespace NestedObjectWithRequiredField { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts index 8d7eb454cdc6..714c7594bacd 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -1,10 +1,21 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const ObjectWithMapOfMap: z.ZodTypeAny = z.object({ +const _ObjectWithMapOfMap_Schema = z.object({ map: z.record(z.string(), z.record(z.string(), z.string())), }); +export const ObjectWithMapOfMap: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithMapOfMap; + json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => serializers.types.ObjectWithMapOfMap.Raw; +} = { + _schema: _ObjectWithMapOfMap_Schema, + parse: (raw: unknown) => _ObjectWithMapOfMap_Schema.parse(raw) as SeedExhaustive.types.ObjectWithMapOfMap, + json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => parsed as serializers.types.ObjectWithMapOfMap.Raw, +}; export declare namespace ObjectWithMapOfMap { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts index 1d23880450ec..29084d0e7dc7 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -1,8 +1,10 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const ObjectWithOptionalField: z.ZodTypeAny = z.object({ +const _ObjectWithOptionalField_Schema = z.object({ string: z.string().optional(), integer: z.number().optional(), long: z.number().optional(), @@ -23,6 +25,35 @@ export const ObjectWithOptionalField: z.ZodTypeAny = z.object({ map: z.record(z.string(), z.string()).optional(), bigint: z.string().optional(), }); +export const ObjectWithOptionalField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithOptionalField; + json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => serializers.types.ObjectWithOptionalField.Raw; +} = { + _schema: _ObjectWithOptionalField_Schema, + parse: (raw: unknown) => _ObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithOptionalField, + json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => + ({ + string: parsed.string, + integer: parsed.integer, + long: parsed.long, + double: parsed.double, + bool: parsed.bool, + datetime: + parsed.datetime != null + ? parsed.datetime != null + ? parsed.datetime.toISOString() + : parsed.datetime + : parsed.datetime, + date: parsed.date, + uuid: parsed.uuid, + base64: parsed.base64, + list: parsed.list, + set: parsed.set != null ? (parsed.set != null ? Array.from(parsed.set) : parsed.set) : parsed.set, + map: parsed.map, + bigint: parsed.bigint, + }) as serializers.types.ObjectWithOptionalField.Raw, +}; export declare namespace ObjectWithOptionalField { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts index 1ec1d457161b..a721771913f9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -1,10 +1,22 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const ObjectWithRequiredField: z.ZodTypeAny = z.object({ +const _ObjectWithRequiredField_Schema = z.object({ string: z.string(), }); +export const ObjectWithRequiredField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField; + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => serializers.types.ObjectWithRequiredField.Raw; +} = { + _schema: _ObjectWithRequiredField_Schema, + parse: (raw: unknown) => _ObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => + parsed as serializers.types.ObjectWithRequiredField.Raw, +}; export declare namespace ObjectWithRequiredField { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts index c26f233ba016..a243622f1ee5 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -1,8 +1,19 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const OptionalAlias: z.ZodTypeAny = z.string().optional(); +const _OptionalAlias_Schema = z.string().optional(); +export const OptionalAlias: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.OptionalAlias; + json: (parsed: SeedExhaustive.types.OptionalAlias) => serializers.types.OptionalAlias.Raw; +} = { + _schema: _OptionalAlias_Schema, + parse: (raw: unknown) => _OptionalAlias_Schema.parse(raw) as SeedExhaustive.types.OptionalAlias, + json: (parsed: SeedExhaustive.types.OptionalAlias) => parsed as serializers.types.OptionalAlias.Raw, +}; export declare namespace OptionalAlias { export type Raw = string | null | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts index 2636ac268e47..91b493ad4f9a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts @@ -1,15 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; import { Cat } from "./Cat.js"; import { Dog } from "./Dog.js"; -export const Animal: z.ZodTypeAny = z +const _Animal_Schema = z .discriminatedUnion("animal", [ - z.object({ animal: z.literal("dog") }).merge(Dog as z.AnyZodObject), - z.object({ animal: z.literal("cat") }).merge(Cat as z.AnyZodObject), + z.object({ animal: z.literal("dog") }).merge(Dog._schema as z.AnyZodObject), + z.object({ animal: z.literal("cat") }).merge(Cat._schema as z.AnyZodObject), ]) .transform((value) => value); +export const Animal: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Animal; + json: (parsed: SeedExhaustive.types.Animal) => serializers.types.Animal.Raw; +} = { + _schema: _Animal_Schema, + parse: (raw: unknown) => _Animal_Schema.parse(raw) as SeedExhaustive.types.Animal, + json: (parsed: SeedExhaustive.types.Animal) => parsed as serializers.types.Animal.Raw, +}; export declare namespace Animal { export type Raw = Animal.Dog | Animal.Cat; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts index d62218895b75..0d6da57ce642 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts @@ -1,11 +1,22 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const Cat: z.ZodTypeAny = z.object({ +const _Cat_Schema = z.object({ name: z.string(), likesToMeow: z.boolean(), }); +export const Cat: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Cat; + json: (parsed: SeedExhaustive.types.Cat) => serializers.types.Cat.Raw; +} = { + _schema: _Cat_Schema, + parse: (raw: unknown) => _Cat_Schema.parse(raw) as SeedExhaustive.types.Cat, + json: (parsed: SeedExhaustive.types.Cat) => parsed as serializers.types.Cat.Raw, +}; export declare namespace Cat { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts index f04e50af298c..0547a8bc7e85 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts @@ -1,11 +1,22 @@ // This file was auto-generated by Fern from our API Definition. import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; -export const Dog: z.ZodTypeAny = z.object({ +const _Dog_Schema = z.object({ name: z.string(), likesToWoof: z.boolean(), }); +export const Dog: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Dog; + json: (parsed: SeedExhaustive.types.Dog) => serializers.types.Dog.Raw; +} = { + _schema: _Dog_Schema, + parse: (raw: unknown) => _Dog_Schema.parse(raw) as SeedExhaustive.types.Dog, + json: (parsed: SeedExhaustive.types.Dog) => parsed as serializers.types.Dog.Raw, +}; export declare namespace Dog { export interface Raw { From eb2592feffa096bae92413467eef16e45997a2ab Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 20:12:05 -0500 Subject: [PATCH 49/71] refactored zurg to mimic zod format pipeline --- .../core-utilities/CoreUtilitiesManager.ts | 2 +- .../__tests__/ZurgBaseline.test.ts | 41 +- .../formats/ZurgFormat.ts | 471 ++++++++---------- .../client/getAndReturnListOfObjects.ts | 10 +- .../client/getAndReturnListOfPrimitives.ts | 10 +- .../client/getAndReturnMapOfPrimToObject.ts | 10 +- .../client/getAndReturnMapPrimToPrim.ts | 10 +- .../container/client/getAndReturnOptional.ts | 6 +- .../client/getAndReturnSetOfObjects.ts | 10 +- .../client/getAndReturnSetOfPrimitives.ts | 10 +- .../httpMethods/client/testDelete.ts | 6 +- .../resources/httpMethods/client/testGet.ts | 6 +- ...tAndReturnNestedWithRequiredFieldAsList.ts | 6 +- .../params/client/getWithInlinePath.ts | 6 +- .../resources/params/client/getWithPath.ts | 6 +- .../params/client/modifyWithInlinePath.ts | 12 +- .../resources/params/client/modifyWithPath.ts | 10 +- .../primitive/client/getAndReturnBase64.ts | 14 +- .../primitive/client/getAndReturnBool.ts | 12 +- .../primitive/client/getAndReturnDate.ts | 12 +- .../primitive/client/getAndReturnDatetime.ts | 14 +- .../primitive/client/getAndReturnDouble.ts | 14 +- .../primitive/client/getAndReturnInt.ts | 10 +- .../primitive/client/getAndReturnLong.ts | 12 +- .../primitive/client/getAndReturnString.ts | 14 +- .../primitive/client/getAndReturnUuid.ts | 12 +- .../resources/put/types/ErrorCategory.ts | 6 +- .../resources/put/types/ErrorCode.ts | 32 +- .../endpoints/resources/put/types/Error_.ts | 18 +- .../resources/put/types/PutResponse.ts | 8 +- .../resources/urls/client/noEndingSlash.ts | 6 +- .../resources/urls/client/withEndingSlash.ts | 6 +- .../resources/urls/client/withMixedCase.ts | 6 +- .../resources/urls/client/withUnderscores.ts | 6 +- .../types/BadObjectRequestInfo.ts | 8 +- .../client/requests/PostWithObjectBody.ts | 12 +- .../resources/noAuth/client/postWithNoAuth.ts | 6 +- .../noReqBody/client/postWithNoRequestBody.ts | 6 +- .../client/getWithCustomHeader.ts | 6 +- .../resources/docs/types/ObjectWithDocs.ts | 8 +- .../resources/enum/types/WeatherReport.ts | 6 +- .../resources/object/types/DoubleOptional.ts | 6 +- .../types/NestedObjectWithOptionalField.ts | 10 +- .../types/NestedObjectWithRequiredField.ts | 10 +- .../object/types/ObjectWithMapOfMap.ts | 12 +- .../object/types/ObjectWithOptionalField.ts | 32 +- .../object/types/ObjectWithRequiredField.ts | 8 +- .../resources/object/types/OptionalAlias.ts | 6 +- .../types/resources/union/types/Animal.ts | 21 +- .../types/resources/union/types/Cat.ts | 10 +- .../types/resources/union/types/Dog.ts | 10 +- 51 files changed, 452 insertions(+), 559 deletions(-) diff --git a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts index eeb2059eced2..3518231555f7 100644 --- a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts +++ b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts @@ -158,7 +158,7 @@ export class CoreUtilitiesManager { case "zurg": // Add Zurg manifest to referenced utilities so it gets copied this.addManifestAndDependencies(ZURG_MANIFEST); - return new ZurgFormat(config); + return new ZurgFormat(config, importsManager); case "zod": return new ZodFormat(config, importsManager); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts index 72a069b0b6cc..451babd4c335 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgBaseline.test.ts @@ -1,7 +1,5 @@ import { ts } from "ts-morph"; import { describe, expect, it } from "vitest"; -import { CoreUtility } from "../../core-utilities/CoreUtility"; -import { Reference } from "../../referencing"; import { ZURG_MANIFEST, ZurgFormat } from "../formats/ZurgFormat"; /** @@ -14,42 +12,15 @@ function printNode(node: ts.Node): string { } /** - * Create a mock reference that simulates what the real system does. - * This creates references like `serialization.object(...)` etc. - */ -function createMockReference(exportedName: string): Reference { - return { - getExpression: () => { - return ts.factory.createPropertyAccessExpression( - ts.factory.createIdentifier("serialization"), - ts.factory.createIdentifier(exportedName) - ); - }, - getTypeNode: () => { - return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName( - ts.factory.createIdentifier("serialization"), - ts.factory.createIdentifier(exportedName) - ), - undefined - ); - }, - getEntityName: () => { - return ts.factory.createQualifiedName( - ts.factory.createIdentifier("serialization"), - ts.factory.createIdentifier(exportedName) - ); - } - }; -} - -/** - * Create a ZurgFormat instance for testing + * Create a ZurgFormat instance for testing. + * We don't pass ImportsManager for unit tests - the import tracking + * is only needed for actual code generation. */ function createZurg(): ZurgFormat { return new ZurgFormat({ - getReferenceToExport: ({ exportedName }: { manifest: CoreUtility.Manifest; exportedName: string }) => - createMockReference(exportedName), + getReferenceToExport: () => { + throw new Error("getReferenceToExport should not be called in new ZurgFormat"); + }, generateEndpointMetadata: false }); } diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index c8c91181c2e2..bd330513014b 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -1,6 +1,7 @@ import { ts } from "ts-morph"; + import { CoreUtility } from "../../core-utilities/CoreUtility"; -import { Reference } from "../../referencing"; +import { ImportsManager } from "../../imports-manager"; import { AdditionalProperty, ObjectLikeSchema, @@ -17,6 +18,7 @@ import { /** * Manifest for the Zurg runtime files. + * Used by CoreUtilitiesManager to copy runtime files to generated SDK. */ export const ZURG_MANIFEST: CoreUtility.Manifest = { name: "schemas", @@ -36,34 +38,62 @@ interface ZurgBaseSchema extends Schema { } /** - * Zurg implementation of the SerializationFormat protocol. - * This generates TypeScript AST that uses Zurg's runtime schema library. + * Helper to create a property access expression like `serialization.string()`. + */ +function createSerializationCall(methodName: string, args: ts.Expression[] = []): ts.Expression { + return ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("serialization"), + ts.factory.createIdentifier(methodName) + ), + undefined, + args + ); +} + +/** + * Helper to chain a method call on an expression + */ +function chainMethod(expr: ts.Expression, methodName: string, args: ts.Expression[] = []): ts.Expression { + return ts.factory.createCallExpression( + ts.factory.createPropertyAccessExpression(expr, ts.factory.createIdentifier(methodName)), + undefined, + args + ); +} + +/** + * ZurgFormat - generates Zurg schema code. + * Uses locally bundled runtime files with simple import pattern. */ export class ZurgFormat implements SerializationFormat { public readonly name = "zurg" as const; - private getReferenceToExport: (args: { manifest: CoreUtility.Manifest; exportedName: string }) => Reference; + private importsManager?: ImportsManager; + private hasAddedSerializationImport = false; private generateEndpointMetadata: boolean; - constructor(config: SerializationFormatConfig) { - this.getReferenceToExport = config.getReferenceToExport; + constructor(config: SerializationFormatConfig, importsManager?: ImportsManager) { + this.importsManager = importsManager; this.generateEndpointMetadata = config.generateEndpointMetadata; } - // ==================== Helper to get reference to exported name ==================== + /** + * Ensure the serialization import is added to the current file + */ + private ensureSerializationImport(): void { + if (!this.hasAddedSerializationImport && this.importsManager) { + this.importsManager.addImportFromRoot("core/schemas", { namespaceImport: "serialization" }); + this.hasAddedSerializationImport = true; + } + } - private withExportedName any>( - exportedName: string, - run: (reference: Reference) => F - ): F { - const wrapper = (...args: Parameters): ReturnType => { - const reference = this.getReferenceToExport({ - manifest: ZURG_MANIFEST, - exportedName - }); - return run(reference)(...args); - }; - return wrapper as F; + /** + * Create a serialization call expression and ensure the import is added + */ + private serializationCall(methodName: string, args: ts.Expression[] = []): ts.Expression { + this.ensureSerializationImport(); + return createSerializationCall(methodName, args); } // ==================== Schema Utilities ==================== @@ -178,15 +208,7 @@ export class ZurgFormat implements SerializationFormat { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: true, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - schema.toExpression(), - ts.factory.createIdentifier("nullable") - ), - undefined, - [] - ) + toExpression: () => chainMethod(schema.toExpression(), "nullable") }; return { @@ -199,15 +221,7 @@ export class ZurgFormat implements SerializationFormat { const baseSchema: ZurgBaseSchema = { isOptional: true, isNullable: false, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - schema.toExpression(), - ts.factory.createIdentifier("optional") - ), - undefined, - [] - ) + toExpression: () => chainMethod(schema.toExpression(), "optional") }; return { @@ -220,15 +234,7 @@ export class ZurgFormat implements SerializationFormat { const baseSchema: ZurgBaseSchema = { isOptional: true, isNullable: true, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - schema.toExpression(), - ts.factory.createIdentifier("optionalNullable") - ), - undefined, - [] - ) + toExpression: () => chainMethod(schema.toExpression(), "optionalNullable") }; return { @@ -348,15 +354,7 @@ export class ZurgFormat implements SerializationFormat { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - objectSchema.toExpression(), - ts.factory.createIdentifier("passthrough") - ), - undefined, - [] - ) + toExpression: () => chainMethod(objectSchema.toExpression(), "passthrough") }; return { @@ -373,15 +371,7 @@ export class ZurgFormat implements SerializationFormat { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - ts.factory.createCallExpression( - ts.factory.createPropertyAccessExpression( - objectSchema.toExpression(), - ts.factory.createIdentifier("extend") - ), - undefined, - [extension.toExpression()] - ) + toExpression: () => chainMethod(objectSchema.toExpression(), "extend", [extension.toExpression()]) }; return { @@ -394,14 +384,12 @@ export class ZurgFormat implements SerializationFormat { // ==================== Object Schema Builders ==================== - public object = this.withExportedName("object", (object) => (properties: Property[]): ObjectSchema => { + public object = (properties: Property[]): ObjectSchema => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, toExpression: () => - ts.factory.createCallExpression(object.getExpression(), undefined, [ - this.constructObjectLiteralForProperties(properties) - ]) + this.serializationCall("object", [this.constructObjectLiteralForProperties(properties)]) }; return { @@ -410,29 +398,25 @@ export class ZurgFormat implements SerializationFormat { ...this.getObjectLikeUtils(baseSchema), ...this.getObjectUtils(baseSchema) }; - }); + }; - public objectWithoutOptionalProperties = this.withExportedName( - "objectWithoutOptionalProperties", - (objectWithoutOptionalProperties) => - (properties: Property[]): ObjectSchema => { - const baseSchema: ZurgBaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(objectWithoutOptionalProperties.getExpression(), undefined, [ - this.constructObjectLiteralForProperties(properties) - ]) - }; + public objectWithoutOptionalProperties = (properties: Property[]): ObjectSchema => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + this.serializationCall("objectWithoutOptionalProperties", [ + this.constructObjectLiteralForProperties(properties) + ]) + }; - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema), - ...this.getObjectUtils(baseSchema) - }; - } - ); + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema), + ...this.getObjectUtils(baseSchema) + }; + }; private constructObjectLiteralForProperties(properties: Property[]): ts.ObjectLiteralExpression { return ts.factory.createObjectLiteralExpression( @@ -447,149 +431,122 @@ export class ZurgFormat implements SerializationFormat { ); } - private property = this.withExportedName( - "property", - (property) => - (rawValue: string, value: ts.Expression): ts.Expression => { - return ts.factory.createCallExpression(property.getExpression(), undefined, [ - ts.factory.createStringLiteral(rawValue), - value - ]); - } - ); + private property(rawValue: string, value: ts.Expression): ts.Expression { + return this.serializationCall("property", [ts.factory.createStringLiteral(rawValue), value]); + } // ==================== Union Schema Builders ==================== - public union = this.withExportedName( - "union", - (union: Reference) => - ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: UnionArgs): ObjectLikeSchema => { - const discriminantArgument = - parsedDiscriminant === rawDiscriminant - ? ts.factory.createStringLiteral(parsedDiscriminant) - : this.discriminant({ parsedDiscriminant, rawDiscriminant }); + public union = ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: UnionArgs): ObjectLikeSchema => { + const discriminantArgument = + parsedDiscriminant === rawDiscriminant + ? ts.factory.createStringLiteral(parsedDiscriminant) + : this.discriminant({ parsedDiscriminant, rawDiscriminant }); - const baseSchema: ZurgBaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(union.getExpression(), undefined, [ - discriminantArgument, - ts.factory.createObjectLiteralExpression( - singleUnionTypes.map((singleUnionType) => - ts.factory.createPropertyAssignment( - ts.factory.createStringLiteral(singleUnionType.discriminantValue), - singleUnionType.nonDiscriminantProperties.toExpression() - ) - ), - true + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + this.serializationCall("union", [ + discriminantArgument, + ts.factory.createObjectLiteralExpression( + singleUnionTypes.map((singleUnionType) => + ts.factory.createPropertyAssignment( + ts.factory.createStringLiteral(singleUnionType.discriminantValue), + singleUnionType.nonDiscriminantProperties.toExpression() ) - ]) - }; + ), + true + ) + ]) + }; - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema), - ...this.getObjectLikeUtils(baseSchema) - }; - } - ); + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema), + ...this.getObjectLikeUtils(baseSchema) + }; + }; - private discriminant = this.withExportedName( - "discriminant", - (discriminant) => - ({ - parsedDiscriminant, - rawDiscriminant - }: { - parsedDiscriminant: string; - rawDiscriminant: string; - }): ts.Expression => { - return ts.factory.createCallExpression(discriminant.getExpression(), undefined, [ - ts.factory.createStringLiteral(parsedDiscriminant), - ts.factory.createStringLiteral(rawDiscriminant) - ]); - } - ); + private discriminant({ + parsedDiscriminant, + rawDiscriminant + }: { + parsedDiscriminant: string; + rawDiscriminant: string; + }): ts.Expression { + return this.serializationCall("discriminant", [ + ts.factory.createStringLiteral(parsedDiscriminant), + ts.factory.createStringLiteral(rawDiscriminant) + ]); + } - public undiscriminatedUnion = this.withExportedName( - "undiscriminatedUnion", - (undiscriminatedUnion: Reference) => (schemas: Schema[]) => { - const baseSchema: ZurgBaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(undiscriminatedUnion.getExpression(), undefined, [ - ts.factory.createArrayLiteralExpression(schemas.map((schema) => schema.toExpression())) - ]) - }; + public undiscriminatedUnion = (schemas: Schema[]): SchemaWithUtils => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + this.serializationCall("undiscriminatedUnion", [ + ts.factory.createArrayLiteralExpression(schemas.map((schema) => schema.toExpression())) + ]) + }; - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - ); + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; // ==================== Collection Schema Builders ==================== - public list = this.withExportedName("list", (list: Reference) => (itemSchema: Schema) => { + public list = (itemSchema: Schema): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - ts.factory.createCallExpression(list.getExpression(), undefined, [itemSchema.toExpression()]) + toExpression: () => this.serializationCall("list", [itemSchema.toExpression()]) }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public set = this.withExportedName("set", (set: Reference) => (itemSchema: Schema) => { + public set = (itemSchema: Schema): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - ts.factory.createCallExpression(set.getExpression(), undefined, [itemSchema.toExpression()]) + toExpression: () => this.serializationCall("set", [itemSchema.toExpression()]) }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public record = this.withExportedName( - "record", - (record: Reference) => - ({ keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }) => { - const baseSchema: ZurgBaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(record.getExpression(), undefined, [ - keySchema.toExpression(), - valueSchema.toExpression() - ]) - }; + public record = ({ keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + this.serializationCall("record", [keySchema.toExpression(), valueSchema.toExpression()]) + }; - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - ); + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; // ==================== Enum Schema Builder ==================== - public enum = this.withExportedName("enum_", (enum_: Reference) => (values: string[]) => { + public enum = (values: string[]): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, toExpression: () => - ts.factory.createCallExpression(enum_.getExpression(), undefined, [ + this.serializationCall("enum_", [ ts.factory.createArrayLiteralExpression( values.map((value) => ts.factory.createStringLiteral(value)) ) @@ -600,157 +557,151 @@ export class ZurgFormat implements SerializationFormat { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; // ==================== Primitive Schema Builders ==================== - public string = this.withExportedName("string", (string: Reference) => () => { + public string = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => ts.factory.createCallExpression(string.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("string") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public stringLiteral = this.withExportedName("stringLiteral", (stringLiteral: Reference) => (literal: string) => { + public stringLiteral = (literal: string): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - ts.factory.createCallExpression(stringLiteral.getExpression(), undefined, [ - ts.factory.createStringLiteral(literal) - ]) + toExpression: () => this.serializationCall("stringLiteral", [ts.factory.createStringLiteral(literal)]) }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public booleanLiteral = this.withExportedName( - "booleanLiteral", - (booleanLiteral: Reference) => (literal: boolean) => { - const baseSchema: ZurgBaseSchema = { - isOptional: false, - isNullable: false, - toExpression: () => - ts.factory.createCallExpression(booleanLiteral.getExpression(), undefined, [ - literal ? ts.factory.createTrue() : ts.factory.createFalse() - ]) - }; + public booleanLiteral = (literal: boolean): SchemaWithUtils => { + const baseSchema: ZurgBaseSchema = { + isOptional: false, + isNullable: false, + toExpression: () => + this.serializationCall("booleanLiteral", [ + literal ? ts.factory.createTrue() : ts.factory.createFalse() + ]) + }; - return { - ...baseSchema, - ...this.getSchemaUtils(baseSchema) - }; - } - ); + return { + ...baseSchema, + ...this.getSchemaUtils(baseSchema) + }; + }; - public number = this.withExportedName("number", (number: Reference) => () => { + public number = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => ts.factory.createCallExpression(number.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("number") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public bigint = this.withExportedName("bigint", (bigint: Reference) => () => { + public bigint = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => ts.factory.createCallExpression(bigint.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("bigint") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public boolean = this.withExportedName("boolean", (boolean: Reference) => () => { + public boolean = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => ts.factory.createCallExpression(boolean.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("boolean") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public date = this.withExportedName("date", (date: Reference) => () => { + public date = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => ts.factory.createCallExpression(date.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("date") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public any = this.withExportedName("any", (any: Reference) => () => { + public any = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: true, - toExpression: () => ts.factory.createCallExpression(any.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("any") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public unknown = this.withExportedName("unknown", (unknown: Reference) => () => { + public unknown = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: true, isNullable: false, - toExpression: () => ts.factory.createCallExpression(unknown.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("unknown") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public never = this.withExportedName("never", (never: Reference) => () => { + public never = (): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => ts.factory.createCallExpression(never.getExpression(), undefined, undefined) + toExpression: () => this.serializationCall("never") }; return { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; // ==================== Lazy Schema Builders ==================== - public lazy = this.withExportedName("lazy", (lazy) => (schema: Schema): SchemaWithUtils => { + public lazy = (schema: Schema): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: schema.isOptional, isNullable: schema.isNullable, toExpression: () => - ts.factory.createCallExpression(lazy.getExpression(), undefined, [ + this.serializationCall("lazy", [ ts.factory.createArrowFunction([], undefined, [], undefined, undefined, schema.toExpression()) ]) }; @@ -759,14 +710,14 @@ export class ZurgFormat implements SerializationFormat { ...baseSchema, ...this.getSchemaUtils(baseSchema) }; - }); + }; - public lazyObject = this.withExportedName("lazyObject", (lazyObject) => (schema: Schema): ObjectSchema => { + public lazyObject = (schema: Schema): ObjectSchema => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: schema.isNullable, toExpression: () => - ts.factory.createCallExpression(lazyObject.getExpression(), undefined, [ + this.serializationCall("lazyObject", [ ts.factory.createArrowFunction([], undefined, [], undefined, undefined, schema.toExpression()) ]) }; @@ -777,17 +728,18 @@ export class ZurgFormat implements SerializationFormat { ...this.getObjectLikeUtils(baseSchema), ...this.getObjectUtils(baseSchema) }; - }); + }; // ==================== Type Utilities ==================== public Schema = { - _getReferenceToType: this.withExportedName( - "Schema", - (Schema) => - ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => - ts.factory.createTypeReferenceNode(Schema.getEntityName(), [rawShape, parsedShape]) - ), + _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + this.ensureSerializationImport(); + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName(ts.factory.createIdentifier("serialization"), "Schema"), + [rawShape, parsedShape] + ); + }, _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { @@ -864,12 +816,13 @@ export class ZurgFormat implements SerializationFormat { }; public ObjectSchema = { - _getReferenceToType: this.withExportedName( - "ObjectSchema", - (ObjectSchema) => - ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => - ts.factory.createTypeReferenceNode(ObjectSchema.getEntityName(), [rawShape, parsedShape]) - ) + _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { + this.ensureSerializationImport(); + return ts.factory.createTypeReferenceNode( + ts.factory.createQualifiedName(ts.factory.createIdentifier("serialization"), "ObjectSchema"), + [rawShape, parsedShape] + ); + } }; public MaybeValid = { @@ -890,7 +843,7 @@ export class ZurgFormat implements SerializationFormat { // ==================== Runtime Configuration ==================== public getRuntimeDependencies(): Record { - // Zurg bundles its own runtime, no npm dependencies needed + // Zurg uses locally bundled runtime, no npm dependencies needed return {}; } diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts index e37f244ea60c..4866a9d8d770 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts index 668b72ec3402..adb39e17c39b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, string[] -> = core.serialization.list(core.serialization.string()); +> = serialization.list(serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, string[] -> = core.serialization.list(core.serialization.string()); +> = serialization.list(serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts index 242978c11a34..25acdb82fb28 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); +> = serialization.record(serialization.string(), ObjectWithRequiredField); export declare namespace Request { export type Raw = Record; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); +> = serialization.record(serialization.string(), ObjectWithRequiredField); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts index 9003c1ac3676..798054261d42 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); +> = serialization.record(serialization.string(), serialization.string()); export declare namespace Request { export type Raw = Record; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); +> = serialization.record(serialization.string(), serialization.string()); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts index b7e20374f571..aba0ab439f6d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -1,11 +1,11 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as core from "../../../../../../core/index.js"; +import type * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); @@ -14,7 +14,7 @@ export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw | null | undefined; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts index 4792425484f1..f8a7f9ea7545 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts index 53931f5e393e..5ad5cb13eddf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, Set -> = core.serialization.set(core.serialization.string()); +> = serialization.set(serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, Set -> = core.serialization.set(core.serialization.string()); +> = serialization.set(serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts index b6273278aa1f..8322487928fc 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts index a642aa120d8b..56a70eed1b68 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts index 60f40db3f33b..a075c14e0cf7 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, SeedExhaustive.types.NestedObjectWithRequiredField[] -> = core.serialization.list(NestedObjectWithRequiredField); +> = serialization.list(NestedObjectWithRequiredField); export declare namespace Request { export type Raw = NestedObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts index c82dda746e5a..9a2139917311 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts index da8888318c5b..b620a7ba796a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts index b84b3f790f22..85205c392705 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.params.modifyWithInlinePath.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts index 8369d9dae207..c7784b75b36c 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts index eb7fdb1065fb..0900f791e8c9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, - string -> = core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts index f51fb5f9e891..6fb2f3a6385a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.boolean(); +export const Request: serialization.Schema = + serialization.boolean(); export declare namespace Request { export type Raw = boolean; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBool.Response.Raw, - boolean -> = core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts index 08ac416d1caf..c1ba4ac07088 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDate.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts index a80c46b7f418..a0f8e8d67e2f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, - Date -> = core.serialization.date(); +export const Request: serialization.Schema = + serialization.date(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, - Date -> = core.serialization.date(); +export const Response: serialization.Schema = + serialization.date(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts index bba9c504ff71..39fad02041dc 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, - number -> = core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, - number -> = core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts index 552fe3843ef9..52a29cbb7b23 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema = - core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts index 191eda735e47..8de6541f8cbf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnLong.Response.Raw, - number -> = core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts index f75bf59ba909..230f9bfc7f6e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Request.Raw, - string -> = core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts index 64875010a017..e11f5ffe387f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts index 47e249372cff..c1a5d0978baf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCategory: core.serialization.Schema< +export const ErrorCategory: serialization.Schema< serializers.endpoints.ErrorCategory.Raw, SeedExhaustive.endpoints.ErrorCategory -> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +> = serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); export declare namespace ErrorCategory { export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts index a36b10d4b362..b8a7dbb5a29b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -1,25 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCode: core.serialization.Schema< - serializers.endpoints.ErrorCode.Raw, - SeedExhaustive.endpoints.ErrorCode -> = core.serialization.enum_([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", -]); +export const ErrorCode: serialization.Schema = + serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", + ]); export declare namespace ErrorCode { export type Raw = diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts index 59ab664d43a2..1f0e2699482d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -1,20 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ErrorCategory } from "./ErrorCategory.js"; import { ErrorCode } from "./ErrorCode.js"; -export const Error_: core.serialization.ObjectSchema< - serializers.endpoints.Error_.Raw, - SeedExhaustive.endpoints.Error_ -> = core.serialization.object({ - category: ErrorCategory, - code: ErrorCode, - detail: core.serialization.string().optional(), - field: core.serialization.string().optional(), -}); +export const Error_: serialization.ObjectSchema = + serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: serialization.string().optional(), + field: serialization.string().optional(), + }); export declare namespace Error_ { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts index 17af0986c151..7b07487770da 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -1,15 +1,15 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { Error_ } from "./Error_.js"; -export const PutResponse: core.serialization.ObjectSchema< +export const PutResponse: serialization.ObjectSchema< serializers.endpoints.PutResponse.Raw, SeedExhaustive.endpoints.PutResponse -> = core.serialization.object({ - errors: core.serialization.list(Error_).optional(), +> = serialization.object({ + errors: serialization.list(Error_).optional(), }); export declare namespace PutResponse { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts index 2b0a2cfbfa53..e3b901d01021 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts index de39ec7a2a0d..4db7cfd2be32 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts index ffedf860047a..34921f105169 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts index 8d308fd3e42f..2d83f47ca591 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts index 5d81697cccfb..dc034215328d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../api/index.js"; -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const BadObjectRequestInfo: core.serialization.ObjectSchema< +export const BadObjectRequestInfo: serialization.ObjectSchema< serializers.BadObjectRequestInfo.Raw, SeedExhaustive.BadObjectRequestInfo -> = core.serialization.object({ - message: core.serialization.string(), +> = serialization.object({ + message: serialization.string(), }); export declare namespace BadObjectRequestInfo { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts index d8c20c33277a..7b4d13692e91 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../api/index.js"; -import * as core from "../../../../../core/index.js"; +import * as serialization from "../../../../../core/schemas/index.js"; import type * as serializers from "../../../../index.js"; import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; -export const PostWithObjectBody: core.serialization.Schema< +export const PostWithObjectBody: serialization.Schema< serializers.PostWithObjectBody.Raw, SeedExhaustive.PostWithObjectBody -> = core.serialization.object({ - string: core.serialization.string(), - integer: core.serialization.number(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +> = serialization.object({ + string: serialization.string(), + integer: serialization.number(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace PostWithObjectBody { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts index 8e7617816edf..f7612cea2aaf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts index c0cba3668202..1e6dd32ad43e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts index 70ac5077c6f2..757092ecd703 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts index ab35ed9023bd..84741ea03b10 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithDocs: core.serialization.ObjectSchema< +export const ObjectWithDocs: serialization.ObjectSchema< serializers.types.ObjectWithDocs.Raw, SeedExhaustive.types.ObjectWithDocs -> = core.serialization.object({ - string: core.serialization.string(), +> = serialization.object({ + string: serialization.string(), }); export declare namespace ObjectWithDocs { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts index 96a37eda2a46..e2ef4f8b1761 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const WeatherReport: core.serialization.Schema< +export const WeatherReport: serialization.Schema< serializers.types.WeatherReport.Raw, SeedExhaustive.types.WeatherReport -> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +> = serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); export declare namespace WeatherReport { export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts index e8e0fd387243..9abd1d7694aa 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { OptionalAlias } from "./OptionalAlias.js"; -export const DoubleOptional: core.serialization.ObjectSchema< +export const DoubleOptional: serialization.ObjectSchema< serializers.types.DoubleOptional.Raw, SeedExhaustive.types.DoubleOptional -> = core.serialization.object({ +> = serialization.object({ optionalAlias: OptionalAlias.optional(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts index c754d9aba654..60110017a1f0 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< +export const NestedObjectWithOptionalField: serialization.ObjectSchema< serializers.types.NestedObjectWithOptionalField.Raw, SeedExhaustive.types.NestedObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), +> = serialization.object({ + string: serialization.string().optional(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField.optional()), }); export declare namespace NestedObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts index cd443843bf86..d80cf48ee660 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< +export const NestedObjectWithRequiredField: serialization.ObjectSchema< serializers.types.NestedObjectWithRequiredField.Raw, SeedExhaustive.types.NestedObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +> = serialization.object({ + string: serialization.string(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace NestedObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts index c7426a9b9847..04267ee70c58 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithMapOfMap: core.serialization.ObjectSchema< +export const ObjectWithMapOfMap: serialization.ObjectSchema< serializers.types.ObjectWithMapOfMap.Raw, SeedExhaustive.types.ObjectWithMapOfMap -> = core.serialization.object({ - map: core.serialization.record( - core.serialization.string(), - core.serialization.record(core.serialization.string(), core.serialization.string()), +> = serialization.object({ + map: serialization.record( + serialization.string(), + serialization.record(serialization.string(), serialization.string()), ), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts index 44a200707fd8..462e91e5c8db 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -1,26 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithOptionalField: core.serialization.ObjectSchema< +export const ObjectWithOptionalField: serialization.ObjectSchema< serializers.types.ObjectWithOptionalField.Raw, SeedExhaustive.types.ObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - integer: core.serialization.number().optional(), - long: core.serialization.number().optional(), - double: core.serialization.number().optional(), - bool: core.serialization.boolean().optional(), - datetime: core.serialization.date().optional(), - date: core.serialization.string().optional(), - uuid: core.serialization.string().optional(), - base64: core.serialization.string().optional(), - list: core.serialization.list(core.serialization.string()).optional(), - set: core.serialization.set(core.serialization.string()).optional(), - map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), - bigint: core.serialization.string().optional(), +> = serialization.object({ + string: serialization.string().optional(), + integer: serialization.number().optional(), + long: serialization.number().optional(), + double: serialization.number().optional(), + bool: serialization.boolean().optional(), + datetime: serialization.date().optional(), + date: serialization.string().optional(), + uuid: serialization.string().optional(), + base64: serialization.string().optional(), + list: serialization.list(serialization.string()).optional(), + set: serialization.set(serialization.string()).optional(), + map: serialization.record(serialization.number(), serialization.string()).optional(), + bigint: serialization.string().optional(), }); export declare namespace ObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts index b6887e41337d..ca11412dccbb 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithRequiredField: core.serialization.ObjectSchema< +export const ObjectWithRequiredField: serialization.ObjectSchema< serializers.types.ObjectWithRequiredField.Raw, SeedExhaustive.types.ObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), +> = serialization.object({ + string: serialization.string(), }); export declare namespace ObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts index a7798d5904bf..d684396d649e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const OptionalAlias: core.serialization.Schema< +export const OptionalAlias: serialization.Schema< serializers.types.OptionalAlias.Raw, SeedExhaustive.types.OptionalAlias -> = core.serialization.string().optional(); +> = serialization.string().optional(); export declare namespace OptionalAlias { export type Raw = string | null | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts index 83b27d0bb69d..8b7ba0c9d0ae 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts @@ -1,21 +1,20 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { Cat } from "./Cat.js"; import { Dog } from "./Dog.js"; -export const Animal: core.serialization.Schema = - core.serialization - .union("animal", { - dog: Dog, - cat: Cat, - }) - .transform({ - transform: (value) => value, - untransform: (value) => value, - }); +export const Animal: serialization.Schema = serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); export declare namespace Animal { export type Raw = Animal.Dog | Animal.Cat; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts index 16f8a2006e5c..c040be8e6aed 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Cat: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToMeow: core.serialization.boolean(), +export const Cat: serialization.ObjectSchema = + serialization.object({ + name: serialization.string(), + likesToMeow: serialization.boolean(), }); export declare namespace Cat { diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts index 271a1f3a4afa..5f6f040b3331 100644 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Dog: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToWoof: core.serialization.boolean(), +export const Dog: serialization.ObjectSchema = + serialization.object({ + name: serialization.string(), + likesToWoof: serialization.boolean(), }); export declare namespace Dog { From 75c6f906a887ea182224f2f548a8e0b4b9efffe2 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 21:27:04 -0500 Subject: [PATCH 50/71] fixed zurg test failures --- .../src/serialization-pipeline/formats/ZodFormat.ts | 9 +++------ .../src/serialization-pipeline/formats/ZurgFormat.ts | 10 +++------- .../resources/primitive/client/getAndReturnInt.ts | 10 +++++----- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 63b13575273d..6f134e876487 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -16,7 +16,7 @@ import { /** * Zod version to use as dependency. - * @todo Make this configurable from a client standpoint. This would be complex to implement because it would likely + * @todo Make this configurable from a client standpoint. This would be complex to implement because it would likely * involve scanning Zod's api at the given version and code-generating based on the results of the scan. */ const ZOD_VERSION = "^3.23.0"; @@ -321,9 +321,7 @@ export class ZodFormat implements SerializationFormat { public object = (properties: Property[]): ObjectSchema => { // Check if any property has toJsonExpression (needs serialization transform) - const propsWithJsonTransform = properties.filter( - (p) => (p.value as ZodBaseSchema).toJsonExpression != null - ); + const propsWithJsonTransform = properties.filter((p) => (p.value as ZodBaseSchema).toJsonExpression != null); /** * Creates a toJsonExpression for objects that recursively transforms properties needing serialization. @@ -1014,8 +1012,7 @@ export class ZodFormat implements SerializationFormat { isOptional: false, isNullable: false, // Return expression._schema for use in schema composition (z.array(), z.record(), etc.) - toExpression: () => - ts.factory.createPropertyAccessExpression(expression, "_schema"), + toExpression: () => ts.factory.createPropertyAccessExpression(expression, "_schema"), // Generate: schemaRef.json(parsed) for serialization // This calls the json method on the wrapper object generated in writeSchemaToFile toJsonExpression: (parsed) => diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index bd330513014b..78f2b5cc7a04 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -388,8 +388,7 @@ export class ZurgFormat implements SerializationFormat { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - this.serializationCall("object", [this.constructObjectLiteralForProperties(properties)]) + toExpression: () => this.serializationCall("object", [this.constructObjectLiteralForProperties(properties)]) }; return { @@ -529,8 +528,7 @@ export class ZurgFormat implements SerializationFormat { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, - toExpression: () => - this.serializationCall("record", [keySchema.toExpression(), valueSchema.toExpression()]) + toExpression: () => this.serializationCall("record", [keySchema.toExpression(), valueSchema.toExpression()]) }; return { @@ -592,9 +590,7 @@ export class ZurgFormat implements SerializationFormat { isOptional: false, isNullable: false, toExpression: () => - this.serializationCall("booleanLiteral", [ - literal ? ts.factory.createTrue() : ts.factory.createFalse() - ]) + this.serializationCall("booleanLiteral", [literal ? ts.factory.createTrue() : ts.factory.createFalse()]) }; return { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts index 552fe3843ef9..52a29cbb7b23 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema = - core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; From 2980b21adb00024ab75d0007a60c6c042d96b746 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 21:27:17 -0500 Subject: [PATCH 51/71] generated tests --- .../client/getAndReturnListOfObjects.ts | 10 +++--- .../client/getAndReturnListOfPrimitives.ts | 10 +++--- .../client/getAndReturnMapOfPrimToObject.ts | 10 +++--- .../client/getAndReturnMapPrimToPrim.ts | 10 +++--- .../container/client/getAndReturnOptional.ts | 6 ++-- .../client/getAndReturnSetOfObjects.ts | 10 +++--- .../client/getAndReturnSetOfPrimitives.ts | 10 +++--- .../httpMethods/client/testDelete.ts | 6 ++-- .../resources/httpMethods/client/testGet.ts | 6 ++-- ...tAndReturnNestedWithRequiredFieldAsList.ts | 6 ++-- .../params/client/getWithInlinePath.ts | 6 ++-- .../resources/params/client/getWithPath.ts | 6 ++-- .../params/client/modifyWithInlinePath.ts | 12 +++---- .../resources/params/client/modifyWithPath.ts | 10 +++--- .../primitive/client/getAndReturnBase64.ts | 14 +++----- .../primitive/client/getAndReturnBool.ts | 12 +++---- .../primitive/client/getAndReturnDate.ts | 12 +++---- .../primitive/client/getAndReturnDatetime.ts | 14 +++----- .../primitive/client/getAndReturnDouble.ts | 14 +++----- .../primitive/client/getAndReturnLong.ts | 12 +++---- .../primitive/client/getAndReturnString.ts | 14 +++----- .../primitive/client/getAndReturnUuid.ts | 12 +++---- .../resources/put/types/ErrorCategory.ts | 6 ++-- .../resources/put/types/ErrorCode.ts | 32 +++++++++---------- .../endpoints/resources/put/types/Error_.ts | 18 +++++------ .../resources/put/types/PutResponse.ts | 8 ++--- .../resources/urls/client/noEndingSlash.ts | 6 ++-- .../resources/urls/client/withEndingSlash.ts | 6 ++-- .../resources/urls/client/withMixedCase.ts | 6 ++-- .../resources/urls/client/withUnderscores.ts | 6 ++-- .../types/BadObjectRequestInfo.ts | 8 ++--- .../client/requests/PostWithObjectBody.ts | 12 +++---- .../resources/noAuth/client/postWithNoAuth.ts | 6 ++-- .../noReqBody/client/postWithNoRequestBody.ts | 6 ++-- .../client/getWithCustomHeader.ts | 6 ++-- .../resources/docs/types/ObjectWithDocs.ts | 8 ++--- .../resources/enum/types/WeatherReport.ts | 6 ++-- .../resources/object/types/DoubleOptional.ts | 6 ++-- .../types/NestedObjectWithOptionalField.ts | 10 +++--- .../types/NestedObjectWithRequiredField.ts | 10 +++--- .../object/types/ObjectWithMapOfMap.ts | 12 +++---- .../object/types/ObjectWithOptionalField.ts | 32 +++++++++---------- .../object/types/ObjectWithRequiredField.ts | 8 ++--- .../resources/object/types/OptionalAlias.ts | 6 ++-- .../types/resources/union/types/Animal.ts | 21 ++++++------ .../types/resources/union/types/Cat.ts | 10 +++--- .../types/resources/union/types/Dog.ts | 10 +++--- .../client/getAndReturnListOfObjects.ts | 10 +++--- .../client/getAndReturnListOfPrimitives.ts | 10 +++--- .../client/getAndReturnMapOfPrimToObject.ts | 10 +++--- .../client/getAndReturnMapPrimToPrim.ts | 10 +++--- .../container/client/getAndReturnOptional.ts | 6 ++-- .../client/getAndReturnSetOfObjects.ts | 10 +++--- .../client/getAndReturnSetOfPrimitives.ts | 10 +++--- .../httpMethods/client/testDelete.ts | 6 ++-- .../resources/httpMethods/client/testGet.ts | 6 ++-- ...tAndReturnNestedWithRequiredFieldAsList.ts | 6 ++-- .../params/client/getWithInlinePath.ts | 6 ++-- .../resources/params/client/getWithPath.ts | 6 ++-- .../params/client/modifyWithInlinePath.ts | 12 +++---- .../resources/params/client/modifyWithPath.ts | 10 +++--- .../primitive/client/getAndReturnBase64.ts | 14 +++----- .../primitive/client/getAndReturnBool.ts | 12 +++---- .../primitive/client/getAndReturnDate.ts | 12 +++---- .../primitive/client/getAndReturnDatetime.ts | 14 +++----- .../primitive/client/getAndReturnDouble.ts | 14 +++----- .../primitive/client/getAndReturnInt.ts | 10 +++--- .../primitive/client/getAndReturnLong.ts | 12 +++---- .../primitive/client/getAndReturnString.ts | 14 +++----- .../primitive/client/getAndReturnUuid.ts | 12 +++---- .../resources/put/types/ErrorCategory.ts | 6 ++-- .../resources/put/types/ErrorCode.ts | 32 +++++++++---------- .../endpoints/resources/put/types/Error_.ts | 18 +++++------ .../resources/put/types/PutResponse.ts | 8 ++--- .../resources/urls/client/noEndingSlash.ts | 6 ++-- .../resources/urls/client/withEndingSlash.ts | 6 ++-- .../resources/urls/client/withMixedCase.ts | 6 ++-- .../resources/urls/client/withUnderscores.ts | 6 ++-- .../types/BadObjectRequestInfo.ts | 8 ++--- .../client/requests/PostWithObjectBody.ts | 12 +++---- .../resources/noAuth/client/postWithNoAuth.ts | 6 ++-- .../noReqBody/client/postWithNoRequestBody.ts | 6 ++-- .../client/getWithCustomHeader.ts | 6 ++-- .../resources/docs/types/ObjectWithDocs.ts | 8 ++--- .../resources/enum/types/WeatherReport.ts | 6 ++-- .../resources/object/types/DoubleOptional.ts | 6 ++-- .../types/NestedObjectWithOptionalField.ts | 10 +++--- .../types/NestedObjectWithRequiredField.ts | 10 +++--- .../object/types/ObjectWithMapOfMap.ts | 12 +++---- .../object/types/ObjectWithOptionalField.ts | 32 +++++++++---------- .../object/types/ObjectWithRequiredField.ts | 8 ++--- .../resources/object/types/OptionalAlias.ts | 6 ++-- .../types/resources/union/types/Animal.ts | 21 ++++++------ .../types/resources/union/types/Cat.ts | 10 +++--- .../types/resources/union/types/Dog.ts | 10 +++--- 95 files changed, 461 insertions(+), 523 deletions(-) diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts index e37f244ea60c..4866a9d8d770 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts index 668b72ec3402..adb39e17c39b 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, string[] -> = core.serialization.list(core.serialization.string()); +> = serialization.list(serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, string[] -> = core.serialization.list(core.serialization.string()); +> = serialization.list(serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts index 242978c11a34..25acdb82fb28 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); +> = serialization.record(serialization.string(), ObjectWithRequiredField); export declare namespace Request { export type Raw = Record; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); +> = serialization.record(serialization.string(), ObjectWithRequiredField); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts index 9003c1ac3676..798054261d42 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); +> = serialization.record(serialization.string(), serialization.string()); export declare namespace Request { export type Raw = Record; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); +> = serialization.record(serialization.string(), serialization.string()); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts index b7e20374f571..aba0ab439f6d 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -1,11 +1,11 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as core from "../../../../../../core/index.js"; +import type * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); @@ -14,7 +14,7 @@ export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw | null | undefined; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts index 4792425484f1..f8a7f9ea7545 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts index 53931f5e393e..5ad5cb13eddf 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, Set -> = core.serialization.set(core.serialization.string()); +> = serialization.set(serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, Set -> = core.serialization.set(core.serialization.string()); +> = serialization.set(serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts index b6273278aa1f..8322487928fc 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts index a642aa120d8b..56a70eed1b68 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts index 60f40db3f33b..a075c14e0cf7 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, SeedExhaustive.types.NestedObjectWithRequiredField[] -> = core.serialization.list(NestedObjectWithRequiredField); +> = serialization.list(NestedObjectWithRequiredField); export declare namespace Request { export type Raw = NestedObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts index c82dda746e5a..9a2139917311 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts index da8888318c5b..b620a7ba796a 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts index b84b3f790f22..85205c392705 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.params.modifyWithInlinePath.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts index 8369d9dae207..c7784b75b36c 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts index eb7fdb1065fb..0900f791e8c9 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, - string -> = core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts index f51fb5f9e891..6fb2f3a6385a 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.boolean(); +export const Request: serialization.Schema = + serialization.boolean(); export declare namespace Request { export type Raw = boolean; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBool.Response.Raw, - boolean -> = core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts index 08ac416d1caf..c1ba4ac07088 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDate.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts index a80c46b7f418..a0f8e8d67e2f 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, - Date -> = core.serialization.date(); +export const Request: serialization.Schema = + serialization.date(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, - Date -> = core.serialization.date(); +export const Response: serialization.Schema = + serialization.date(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts index bba9c504ff71..39fad02041dc 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, - number -> = core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, - number -> = core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts index 13a86da3b2b5..4cd44616f168 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.bigint(); +export const Request: serialization.Schema = + serialization.bigint(); export declare namespace Request { export type Raw = bigint | number; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnLong.Response.Raw, - bigint -> = core.serialization.bigint(); +export const Response: serialization.Schema = + serialization.bigint(); export declare namespace Response { export type Raw = bigint | number; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts index f75bf59ba909..230f9bfc7f6e 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Request.Raw, - string -> = core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts index 64875010a017..e11f5ffe387f 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts index 47e249372cff..c1a5d0978baf 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCategory: core.serialization.Schema< +export const ErrorCategory: serialization.Schema< serializers.endpoints.ErrorCategory.Raw, SeedExhaustive.endpoints.ErrorCategory -> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +> = serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); export declare namespace ErrorCategory { export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts index a36b10d4b362..b8a7dbb5a29b 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -1,25 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCode: core.serialization.Schema< - serializers.endpoints.ErrorCode.Raw, - SeedExhaustive.endpoints.ErrorCode -> = core.serialization.enum_([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", -]); +export const ErrorCode: serialization.Schema = + serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", + ]); export declare namespace ErrorCode { export type Raw = diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts index 59ab664d43a2..1f0e2699482d 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -1,20 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ErrorCategory } from "./ErrorCategory.js"; import { ErrorCode } from "./ErrorCode.js"; -export const Error_: core.serialization.ObjectSchema< - serializers.endpoints.Error_.Raw, - SeedExhaustive.endpoints.Error_ -> = core.serialization.object({ - category: ErrorCategory, - code: ErrorCode, - detail: core.serialization.string().optional(), - field: core.serialization.string().optional(), -}); +export const Error_: serialization.ObjectSchema = + serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: serialization.string().optional(), + field: serialization.string().optional(), + }); export declare namespace Error_ { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts index 17af0986c151..7b07487770da 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -1,15 +1,15 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { Error_ } from "./Error_.js"; -export const PutResponse: core.serialization.ObjectSchema< +export const PutResponse: serialization.ObjectSchema< serializers.endpoints.PutResponse.Raw, SeedExhaustive.endpoints.PutResponse -> = core.serialization.object({ - errors: core.serialization.list(Error_).optional(), +> = serialization.object({ + errors: serialization.list(Error_).optional(), }); export declare namespace PutResponse { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts index 2b0a2cfbfa53..e3b901d01021 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts index de39ec7a2a0d..4db7cfd2be32 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts index ffedf860047a..34921f105169 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts index 8d308fd3e42f..2d83f47ca591 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts index 5d81697cccfb..dc034215328d 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../api/index.js"; -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const BadObjectRequestInfo: core.serialization.ObjectSchema< +export const BadObjectRequestInfo: serialization.ObjectSchema< serializers.BadObjectRequestInfo.Raw, SeedExhaustive.BadObjectRequestInfo -> = core.serialization.object({ - message: core.serialization.string(), +> = serialization.object({ + message: serialization.string(), }); export declare namespace BadObjectRequestInfo { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts index d8c20c33277a..7b4d13692e91 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../api/index.js"; -import * as core from "../../../../../core/index.js"; +import * as serialization from "../../../../../core/schemas/index.js"; import type * as serializers from "../../../../index.js"; import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; -export const PostWithObjectBody: core.serialization.Schema< +export const PostWithObjectBody: serialization.Schema< serializers.PostWithObjectBody.Raw, SeedExhaustive.PostWithObjectBody -> = core.serialization.object({ - string: core.serialization.string(), - integer: core.serialization.number(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +> = serialization.object({ + string: serialization.string(), + integer: serialization.number(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace PostWithObjectBody { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts index 8e7617816edf..f7612cea2aaf 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts index c0cba3668202..1e6dd32ad43e 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts index 70ac5077c6f2..757092ecd703 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts index ab35ed9023bd..84741ea03b10 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithDocs: core.serialization.ObjectSchema< +export const ObjectWithDocs: serialization.ObjectSchema< serializers.types.ObjectWithDocs.Raw, SeedExhaustive.types.ObjectWithDocs -> = core.serialization.object({ - string: core.serialization.string(), +> = serialization.object({ + string: serialization.string(), }); export declare namespace ObjectWithDocs { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts index 96a37eda2a46..e2ef4f8b1761 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const WeatherReport: core.serialization.Schema< +export const WeatherReport: serialization.Schema< serializers.types.WeatherReport.Raw, SeedExhaustive.types.WeatherReport -> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +> = serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); export declare namespace WeatherReport { export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts index e8e0fd387243..9abd1d7694aa 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { OptionalAlias } from "./OptionalAlias.js"; -export const DoubleOptional: core.serialization.ObjectSchema< +export const DoubleOptional: serialization.ObjectSchema< serializers.types.DoubleOptional.Raw, SeedExhaustive.types.DoubleOptional -> = core.serialization.object({ +> = serialization.object({ optionalAlias: OptionalAlias.optional(), }); diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts index c754d9aba654..60110017a1f0 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< +export const NestedObjectWithOptionalField: serialization.ObjectSchema< serializers.types.NestedObjectWithOptionalField.Raw, SeedExhaustive.types.NestedObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), +> = serialization.object({ + string: serialization.string().optional(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField.optional()), }); export declare namespace NestedObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts index cd443843bf86..d80cf48ee660 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< +export const NestedObjectWithRequiredField: serialization.ObjectSchema< serializers.types.NestedObjectWithRequiredField.Raw, SeedExhaustive.types.NestedObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +> = serialization.object({ + string: serialization.string(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace NestedObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts index c7426a9b9847..04267ee70c58 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithMapOfMap: core.serialization.ObjectSchema< +export const ObjectWithMapOfMap: serialization.ObjectSchema< serializers.types.ObjectWithMapOfMap.Raw, SeedExhaustive.types.ObjectWithMapOfMap -> = core.serialization.object({ - map: core.serialization.record( - core.serialization.string(), - core.serialization.record(core.serialization.string(), core.serialization.string()), +> = serialization.object({ + map: serialization.record( + serialization.string(), + serialization.record(serialization.string(), serialization.string()), ), }); diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts index c68f47152475..75b99bda2038 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -1,26 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithOptionalField: core.serialization.ObjectSchema< +export const ObjectWithOptionalField: serialization.ObjectSchema< serializers.types.ObjectWithOptionalField.Raw, SeedExhaustive.types.ObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - integer: core.serialization.number().optional(), - long: core.serialization.bigint().optional(), - double: core.serialization.number().optional(), - bool: core.serialization.boolean().optional(), - datetime: core.serialization.date().optional(), - date: core.serialization.string().optional(), - uuid: core.serialization.string().optional(), - base64: core.serialization.string().optional(), - list: core.serialization.list(core.serialization.string()).optional(), - set: core.serialization.set(core.serialization.string()).optional(), - map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), - bigint: core.serialization.bigint().optional(), +> = serialization.object({ + string: serialization.string().optional(), + integer: serialization.number().optional(), + long: serialization.bigint().optional(), + double: serialization.number().optional(), + bool: serialization.boolean().optional(), + datetime: serialization.date().optional(), + date: serialization.string().optional(), + uuid: serialization.string().optional(), + base64: serialization.string().optional(), + list: serialization.list(serialization.string()).optional(), + set: serialization.set(serialization.string()).optional(), + map: serialization.record(serialization.number(), serialization.string()).optional(), + bigint: serialization.bigint().optional(), }); export declare namespace ObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts index b6887e41337d..ca11412dccbb 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithRequiredField: core.serialization.ObjectSchema< +export const ObjectWithRequiredField: serialization.ObjectSchema< serializers.types.ObjectWithRequiredField.Raw, SeedExhaustive.types.ObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), +> = serialization.object({ + string: serialization.string(), }); export declare namespace ObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts index a7798d5904bf..d684396d649e 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const OptionalAlias: core.serialization.Schema< +export const OptionalAlias: serialization.Schema< serializers.types.OptionalAlias.Raw, SeedExhaustive.types.OptionalAlias -> = core.serialization.string().optional(); +> = serialization.string().optional(); export declare namespace OptionalAlias { export type Raw = string | null | undefined; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts index 83b27d0bb69d..8b7ba0c9d0ae 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts @@ -1,21 +1,20 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { Cat } from "./Cat.js"; import { Dog } from "./Dog.js"; -export const Animal: core.serialization.Schema = - core.serialization - .union("animal", { - dog: Dog, - cat: Cat, - }) - .transform({ - transform: (value) => value, - untransform: (value) => value, - }); +export const Animal: serialization.Schema = serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); export declare namespace Animal { export type Raw = Animal.Dog | Animal.Cat; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts index 16f8a2006e5c..c040be8e6aed 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Cat: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToMeow: core.serialization.boolean(), +export const Cat: serialization.ObjectSchema = + serialization.object({ + name: serialization.string(), + likesToMeow: serialization.boolean(), }); export declare namespace Cat { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts index 271a1f3a4afa..5f6f040b3331 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Dog: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToWoof: core.serialization.boolean(), +export const Dog: serialization.ObjectSchema = + serialization.object({ + name: serialization.string(), + likesToWoof: serialization.boolean(), }); export declare namespace Dog { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts index e37f244ea60c..4866a9d8d770 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts index 668b72ec3402..adb39e17c39b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, string[] -> = core.serialization.list(core.serialization.string()); +> = serialization.list(serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, string[] -> = core.serialization.list(core.serialization.string()); +> = serialization.list(serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts index 242978c11a34..25acdb82fb28 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); +> = serialization.record(serialization.string(), ObjectWithRequiredField); export declare namespace Request { export type Raw = Record; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); +> = serialization.record(serialization.string(), ObjectWithRequiredField); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts index 9003c1ac3676..798054261d42 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); +> = serialization.record(serialization.string(), serialization.string()); export declare namespace Request { export type Raw = Record; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); +> = serialization.record(serialization.string(), serialization.string()); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts index b7e20374f571..aba0ab439f6d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -1,11 +1,11 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as core from "../../../../../../core/index.js"; +import type * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); @@ -14,7 +14,7 @@ export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw | null | undefined; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts index 4792425484f1..f8a7f9ea7545 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); +> = serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts index 53931f5e393e..5ad5cb13eddf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, Set -> = core.serialization.set(core.serialization.string()); +> = serialization.set(serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: core.serialization.Schema< +export const Response: serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, Set -> = core.serialization.set(core.serialization.string()); +> = serialization.set(serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts index b6273278aa1f..8322487928fc 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts index a642aa120d8b..56a70eed1b68 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts index 60f40db3f33b..a075c14e0cf7 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; -export const Request: core.serialization.Schema< +export const Request: serialization.Schema< serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, SeedExhaustive.types.NestedObjectWithRequiredField[] -> = core.serialization.list(NestedObjectWithRequiredField); +> = serialization.list(NestedObjectWithRequiredField); export declare namespace Request { export type Raw = NestedObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts index c82dda746e5a..9a2139917311 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts index da8888318c5b..b620a7ba796a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts index b84b3f790f22..85205c392705 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.params.modifyWithInlinePath.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts index 8369d9dae207..c7784b75b36c 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts index eb7fdb1065fb..0900f791e8c9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, - string -> = core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts index f51fb5f9e891..6fb2f3a6385a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.boolean(); +export const Request: serialization.Schema = + serialization.boolean(); export declare namespace Request { export type Raw = boolean; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBool.Response.Raw, - boolean -> = core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts index 08ac416d1caf..c1ba4ac07088 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDate.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts index a80c46b7f418..a0f8e8d67e2f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, - Date -> = core.serialization.date(); +export const Request: serialization.Schema = + serialization.date(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, - Date -> = core.serialization.date(); +export const Response: serialization.Schema = + serialization.date(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts index bba9c504ff71..39fad02041dc 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, - number -> = core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, - number -> = core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts index 552fe3843ef9..52a29cbb7b23 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema = - core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts index 191eda735e47..8de6541f8cbf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.number(); +export const Request: serialization.Schema = + serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnLong.Response.Raw, - number -> = core.serialization.number(); +export const Response: serialization.Schema = + serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts index f75bf59ba909..230f9bfc7f6e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -1,21 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Request.Raw, - string -> = core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts index 64875010a017..e11f5ffe387f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -1,19 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, - string -> = core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts index 47e249372cff..c1a5d0978baf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCategory: core.serialization.Schema< +export const ErrorCategory: serialization.Schema< serializers.endpoints.ErrorCategory.Raw, SeedExhaustive.endpoints.ErrorCategory -> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +> = serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); export declare namespace ErrorCategory { export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts index a36b10d4b362..b8a7dbb5a29b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -1,25 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCode: core.serialization.Schema< - serializers.endpoints.ErrorCode.Raw, - SeedExhaustive.endpoints.ErrorCode -> = core.serialization.enum_([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", -]); +export const ErrorCode: serialization.Schema = + serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", + ]); export declare namespace ErrorCode { export type Raw = diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts index 59ab664d43a2..1f0e2699482d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -1,20 +1,18 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ErrorCategory } from "./ErrorCategory.js"; import { ErrorCode } from "./ErrorCode.js"; -export const Error_: core.serialization.ObjectSchema< - serializers.endpoints.Error_.Raw, - SeedExhaustive.endpoints.Error_ -> = core.serialization.object({ - category: ErrorCategory, - code: ErrorCode, - detail: core.serialization.string().optional(), - field: core.serialization.string().optional(), -}); +export const Error_: serialization.ObjectSchema = + serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: serialization.string().optional(), + field: serialization.string().optional(), + }); export declare namespace Error_ { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts index 17af0986c151..7b07487770da 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -1,15 +1,15 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { Error_ } from "./Error_.js"; -export const PutResponse: core.serialization.ObjectSchema< +export const PutResponse: serialization.ObjectSchema< serializers.endpoints.PutResponse.Raw, SeedExhaustive.endpoints.PutResponse -> = core.serialization.object({ - errors: core.serialization.list(Error_).optional(), +> = serialization.object({ + errors: serialization.list(Error_).optional(), }); export declare namespace PutResponse { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts index 2b0a2cfbfa53..e3b901d01021 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts index de39ec7a2a0d..4db7cfd2be32 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts index ffedf860047a..34921f105169 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts index 8d308fd3e42f..2d83f47ca591 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts index 5d81697cccfb..dc034215328d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../api/index.js"; -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const BadObjectRequestInfo: core.serialization.ObjectSchema< +export const BadObjectRequestInfo: serialization.ObjectSchema< serializers.BadObjectRequestInfo.Raw, SeedExhaustive.BadObjectRequestInfo -> = core.serialization.object({ - message: core.serialization.string(), +> = serialization.object({ + message: serialization.string(), }); export declare namespace BadObjectRequestInfo { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts index d8c20c33277a..7b4d13692e91 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../api/index.js"; -import * as core from "../../../../../core/index.js"; +import * as serialization from "../../../../../core/schemas/index.js"; import type * as serializers from "../../../../index.js"; import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; -export const PostWithObjectBody: core.serialization.Schema< +export const PostWithObjectBody: serialization.Schema< serializers.PostWithObjectBody.Raw, SeedExhaustive.PostWithObjectBody -> = core.serialization.object({ - string: core.serialization.string(), - integer: core.serialization.number(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +> = serialization.object({ + string: serialization.string(), + integer: serialization.number(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace PostWithObjectBody { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts index 8e7617816edf..f7612cea2aaf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.boolean(); +export const Response: serialization.Schema = + serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts index c0cba3668202..1e6dd32ad43e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Response: core.serialization.Schema = - core.serialization.string(); +export const Response: serialization.Schema = + serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts index 70ac5077c6f2..757092ecd703 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as core from "../../../../core/index.js"; +import * as serialization from "../../../../core/schemas/index.js"; import type * as serializers from "../../../index.js"; -export const Request: core.serialization.Schema = - core.serialization.string(); +export const Request: serialization.Schema = + serialization.string(); export declare namespace Request { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts index ab35ed9023bd..84741ea03b10 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithDocs: core.serialization.ObjectSchema< +export const ObjectWithDocs: serialization.ObjectSchema< serializers.types.ObjectWithDocs.Raw, SeedExhaustive.types.ObjectWithDocs -> = core.serialization.object({ - string: core.serialization.string(), +> = serialization.object({ + string: serialization.string(), }); export declare namespace ObjectWithDocs { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts index 96a37eda2a46..e2ef4f8b1761 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const WeatherReport: core.serialization.Schema< +export const WeatherReport: serialization.Schema< serializers.types.WeatherReport.Raw, SeedExhaustive.types.WeatherReport -> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +> = serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); export declare namespace WeatherReport { export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts index e8e0fd387243..9abd1d7694aa 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { OptionalAlias } from "./OptionalAlias.js"; -export const DoubleOptional: core.serialization.ObjectSchema< +export const DoubleOptional: serialization.ObjectSchema< serializers.types.DoubleOptional.Raw, SeedExhaustive.types.DoubleOptional -> = core.serialization.object({ +> = serialization.object({ optionalAlias: OptionalAlias.optional(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts index c754d9aba654..60110017a1f0 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< +export const NestedObjectWithOptionalField: serialization.ObjectSchema< serializers.types.NestedObjectWithOptionalField.Raw, SeedExhaustive.types.NestedObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), +> = serialization.object({ + string: serialization.string().optional(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField.optional()), }); export declare namespace NestedObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts index cd443843bf86..d80cf48ee660 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< +export const NestedObjectWithRequiredField: serialization.ObjectSchema< serializers.types.NestedObjectWithRequiredField.Raw, SeedExhaustive.types.NestedObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +> = serialization.object({ + string: serialization.string(), + nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace NestedObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts index c7426a9b9847..04267ee70c58 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithMapOfMap: core.serialization.ObjectSchema< +export const ObjectWithMapOfMap: serialization.ObjectSchema< serializers.types.ObjectWithMapOfMap.Raw, SeedExhaustive.types.ObjectWithMapOfMap -> = core.serialization.object({ - map: core.serialization.record( - core.serialization.string(), - core.serialization.record(core.serialization.string(), core.serialization.string()), +> = serialization.object({ + map: serialization.record( + serialization.string(), + serialization.record(serialization.string(), serialization.string()), ), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts index 44a200707fd8..462e91e5c8db 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -1,26 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithOptionalField: core.serialization.ObjectSchema< +export const ObjectWithOptionalField: serialization.ObjectSchema< serializers.types.ObjectWithOptionalField.Raw, SeedExhaustive.types.ObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - integer: core.serialization.number().optional(), - long: core.serialization.number().optional(), - double: core.serialization.number().optional(), - bool: core.serialization.boolean().optional(), - datetime: core.serialization.date().optional(), - date: core.serialization.string().optional(), - uuid: core.serialization.string().optional(), - base64: core.serialization.string().optional(), - list: core.serialization.list(core.serialization.string()).optional(), - set: core.serialization.set(core.serialization.string()).optional(), - map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), - bigint: core.serialization.string().optional(), +> = serialization.object({ + string: serialization.string().optional(), + integer: serialization.number().optional(), + long: serialization.number().optional(), + double: serialization.number().optional(), + bool: serialization.boolean().optional(), + datetime: serialization.date().optional(), + date: serialization.string().optional(), + uuid: serialization.string().optional(), + base64: serialization.string().optional(), + list: serialization.list(serialization.string()).optional(), + set: serialization.set(serialization.string()).optional(), + map: serialization.record(serialization.number(), serialization.string()).optional(), + bigint: serialization.string().optional(), }); export declare namespace ObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts index b6887e41337d..ca11412dccbb 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithRequiredField: core.serialization.ObjectSchema< +export const ObjectWithRequiredField: serialization.ObjectSchema< serializers.types.ObjectWithRequiredField.Raw, SeedExhaustive.types.ObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), +> = serialization.object({ + string: serialization.string(), }); export declare namespace ObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts index a7798d5904bf..d684396d649e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const OptionalAlias: core.serialization.Schema< +export const OptionalAlias: serialization.Schema< serializers.types.OptionalAlias.Raw, SeedExhaustive.types.OptionalAlias -> = core.serialization.string().optional(); +> = serialization.string().optional(); export declare namespace OptionalAlias { export type Raw = string | null | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts index 83b27d0bb69d..8b7ba0c9d0ae 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts @@ -1,21 +1,20 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; import { Cat } from "./Cat.js"; import { Dog } from "./Dog.js"; -export const Animal: core.serialization.Schema = - core.serialization - .union("animal", { - dog: Dog, - cat: Cat, - }) - .transform({ - transform: (value) => value, - untransform: (value) => value, - }); +export const Animal: serialization.Schema = serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); export declare namespace Animal { export type Raw = Animal.Dog | Animal.Cat; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts index 16f8a2006e5c..c040be8e6aed 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Cat: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToMeow: core.serialization.boolean(), +export const Cat: serialization.ObjectSchema = + serialization.object({ + name: serialization.string(), + likesToMeow: serialization.boolean(), }); export declare namespace Cat { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts index 271a1f3a4afa..5f6f040b3331 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; +import * as serialization from "../../../../../../core/schemas/index.js"; import type * as serializers from "../../../../../index.js"; -export const Dog: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToWoof: core.serialization.boolean(), +export const Dog: serialization.ObjectSchema = + serialization.object({ + name: serialization.string(), + likesToWoof: serialization.boolean(), }); export declare namespace Dog { From de56e41c8ab5e6be3ee6978733013dcdaf90a229 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 21:33:59 -0500 Subject: [PATCH 52/71] fixed unit tests --- .../serialization-pipeline/__tests__/ZodFormat.test.ts | 4 ++-- .../__tests__/__snapshots__/ZodFormat.test.ts.snap | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts index e6a8422fbfd5..4fcc84f424e1 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZodFormat.test.ts @@ -386,9 +386,9 @@ describe("ZodFormat AST Generation", () => { breadcrumbsPrefix: [] }); const ast = printNode(jsonExpr); - // Should generate: value !== null ? Array.from(value) : value + // Should generate: value != null ? Array.from(value) : value expect(ast).toContain("Array.from(value)"); - expect(ast).toContain("!=="); + expect(ast).toContain("!="); expect(ast).toContain("null"); }); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap index 649cd48d78de..a14211a1d75c 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZodFormat.test.ts.snap @@ -97,7 +97,13 @@ exports[`ZodFormat AST Generation > Schema Modifiers > optionalNullable() genera exports[`ZodFormat AST Generation > Schema Operations > parse() generates .parse() 1`] = `"z.string().parse(rawValue)"`; -exports[`ZodFormat AST Generation > Type References > Schema._getReferenceToType generates z.ZodTypeAny 1`] = `"z.ZodTypeAny"`; +exports[`ZodFormat AST Generation > Type References > Schema._getReferenceToType generates z.ZodTypeAny 1`] = ` +"{ + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => string; +}" +`; exports[`ZodFormat AST Generation > Union Schemas > discriminated union generates z.discriminatedUnion() 1`] = ` "z.discriminatedUnion("type", [ From 5be5be9d47c91e1bdec5e7d5d5449846a8db378d Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 22:36:33 -0500 Subject: [PATCH 53/71] fix for express generator --- generators/typescript/express/generator/src/ExpressGenerator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/express/generator/src/ExpressGenerator.ts b/generators/typescript/express/generator/src/ExpressGenerator.ts index f5f3203e4e12..46b6fbb2d08b 100644 --- a/generators/typescript/express/generator/src/ExpressGenerator.ts +++ b/generators/typescript/express/generator/src/ExpressGenerator.ts @@ -527,7 +527,7 @@ export class ExpressGenerator { this.context.logger.debug(`Generating ${filepathStr}`); const sourceFile = this.rootDirectory.createSourceFile(filepathStr); - const importsManager = new ImportsManager({ packagePath: this.config.packagePath }); + const importsManager = new ImportsManager({ packagePath: this.getRelativePackagePath() }); run({ sourceFile, importsManager }); From a85e11e19e39c07c3ee2f110c2a9feaeff1923f9 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Fri, 5 Dec 2025 23:49:07 -0500 Subject: [PATCH 54/71] added some doc comments --- .../commons/src/serialization-pipeline/formats/ZurgFormat.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index 78f2b5cc7a04..9432d9f9f087 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -19,6 +19,10 @@ import { /** * Manifest for the Zurg runtime files. * Used by CoreUtilitiesManager to copy runtime files to generated SDK. + * + * @abstract @Zurg validation schema files. Note that while they are still currently bundled in the source, the + * next phase will to be move them into a separate public npm package that can be imported in the same manner as Zod and other libs. + * A possible alternative to that is to generate them using ASTs but that would end up being more complex to maintain. */ export const ZURG_MANIFEST: CoreUtility.Manifest = { name: "schemas", From 36af03cc90d227208b1557f1a622b585e07b8422 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 03:21:50 -0500 Subject: [PATCH 55/71] removed exhaustive tests for pr review --- .../serde-layer-none/.fern/metadata.json | 8 - .../serde-layer-none/.github/workflows/ci.yml | 78 - .../exhaustive/serde-layer-none/.gitignore | 3 - .../serde-layer-none/CONTRIBUTING.md | 133 - .../exhaustive/serde-layer-none/README.md | 241 -- .../exhaustive/serde-layer-none/biome.json | 74 - .../exhaustive/serde-layer-none/package.json | 66 - .../serde-layer-none/pnpm-workspace.yaml | 1 - .../exhaustive/serde-layer-none/reference.md | 2761 ----------------- .../scripts/rename-to-esm-files.js | 123 - .../exhaustive/serde-layer-none/snippet.json | 544 ---- .../serde-layer-none/src/BaseClient.ts | 82 - .../exhaustive/serde-layer-none/src/Client.ts | 48 - .../serde-layer-none/src/api/index.ts | 1 - .../api/resources/endpoints/client/Client.ts | 76 - .../api/resources/endpoints/client/index.ts | 1 - .../src/api/resources/endpoints/index.ts | 2 - .../resources/container/client/Client.ts | 458 --- .../resources/container/client/index.ts | 1 - .../endpoints/resources/container/index.ts | 1 - .../resources/contentType/client/Client.ts | 171 - .../resources/contentType/client/index.ts | 1 - .../endpoints/resources/contentType/index.ts | 1 - .../endpoints/resources/enum/client/Client.ts | 80 - .../endpoints/resources/enum/client/index.ts | 1 - .../endpoints/resources/enum/index.ts | 1 - .../resources/httpMethods/client/Client.ts | 334 -- .../resources/httpMethods/client/index.ts | 1 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 13 - .../resources/object/client/Client.ts | 522 ---- .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../resources/params/client/Client.ts | 522 ---- .../resources/params/client/index.ts | 1 - .../client/requests/GetWithInlinePath.ts | 11 - .../requests/GetWithInlinePathAndQuery.ts | 13 - .../client/requests/GetWithMultipleQuery.ts | 13 - .../client/requests/GetWithPathAndQuery.ts | 11 - .../params/client/requests/GetWithQuery.ts | 13 - .../requests/ModifyResourceAtInlinedPath.ts | 13 - .../resources/params/client/requests/index.ts | 6 - .../endpoints/resources/params/index.ts | 1 - .../resources/primitive/client/Client.ts | 535 ---- .../resources/primitive/client/index.ts | 1 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/client/Client.ts | 80 - .../endpoints/resources/put/client/index.ts | 1 - .../put/client/requests/PutRequest.ts | 11 - .../resources/put/client/requests/index.ts | 1 - .../endpoints/resources/put/index.ts | 2 - .../resources/put/types/ErrorCategory.ts | 8 - .../resources/put/types/ErrorCode.ts | 16 - .../endpoints/resources/put/types/Error_.ts | 10 - .../resources/put/types/PutResponse.ts | 7 - .../endpoints/resources/put/types/index.ts | 4 - .../resources/union/client/Client.ts | 84 - .../endpoints/resources/union/client/index.ts | 1 - .../endpoints/resources/union/index.ts | 1 - .../endpoints/resources/urls/client/Client.ts | 210 -- .../endpoints/resources/urls/client/index.ts | 1 - .../endpoints/resources/urls/index.ts | 1 - .../generalErrors/errors/BadRequestBody.ts | 22 - .../resources/generalErrors/errors/index.ts | 1 - .../src/api/resources/generalErrors/index.ts | 2 - .../types/BadObjectRequestInfo.ts | 5 - .../resources/generalErrors/types/index.ts | 1 - .../src/api/resources/index.ts | 11 - .../inlinedRequests/client/Client.ts | 110 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 33 - .../inlinedRequests/client/requests/index.ts | 1 - .../api/resources/inlinedRequests/index.ts | 1 - .../src/api/resources/noAuth/client/Client.ts | 89 - .../src/api/resources/noAuth/client/index.ts | 1 - .../src/api/resources/noAuth/index.ts | 1 - .../api/resources/noReqBody/client/Client.ts | 126 - .../api/resources/noReqBody/client/index.ts | 1 - .../src/api/resources/noReqBody/index.ts | 1 - .../resources/reqWithHeaders/client/Client.ts | 93 - .../resources/reqWithHeaders/client/index.ts | 1 - .../client/requests/ReqWithHeaders.ts | 15 - .../reqWithHeaders/client/requests/index.ts | 1 - .../src/api/resources/reqWithHeaders/index.ts | 1 - .../src/api/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 66 - .../types/resources/docs/types/index.ts | 1 - .../enum/errors/ErrorWithEnumBody.ts | 22 - .../types/resources/enum/errors/index.ts | 1 - .../resources/types/resources/enum/index.ts | 2 - .../resources/enum/types/WeatherReport.ts | 9 - .../types/resources/enum/types/index.ts | 1 - .../api/resources/types/resources/index.ts | 11 - .../NestedObjectWithOptionalFieldError.ts | 22 - .../NestedObjectWithRequiredFieldError.ts | 22 - .../errors/ObjectWithOptionalFieldError.ts | 22 - .../errors/ObjectWithRequiredFieldError.ts | 22 - .../types/resources/object/errors/index.ts | 4 - .../resources/types/resources/object/index.ts | 2 - .../resources/object/types/DoubleOptional.ts | 7 - .../types/NestedObjectWithOptionalField.ts | 8 - .../types/NestedObjectWithRequiredField.ts | 8 - .../object/types/ObjectWithMapOfMap.ts | 5 - .../object/types/ObjectWithOptionalField.ts | 18 - .../object/types/ObjectWithRequiredField.ts | 5 - .../resources/object/types/OptionalAlias.ts | 3 - .../types/resources/object/types/index.ts | 7 - .../union/errors/ErrorWithUnionBody.ts | 22 - .../types/resources/union/errors/index.ts | 1 - .../resources/types/resources/union/index.ts | 2 - .../types/resources/union/types/Animal.ts | 15 - .../types/resources/union/types/Cat.ts | 6 - .../types/resources/union/types/Dog.ts | 6 - .../types/resources/union/types/index.ts | 3 - .../src/auth/BearerAuthProvider.ts | 35 - .../serde-layer-none/src/auth/index.ts | 1 - .../src/core/auth/AuthProvider.ts | 6 - .../src/core/auth/AuthRequest.ts | 9 - .../src/core/auth/BasicAuth.ts | 32 - .../src/core/auth/BearerToken.ts | 20 - .../src/core/auth/NoOpAuthProvider.ts | 8 - .../serde-layer-none/src/core/auth/index.ts | 5 - .../serde-layer-none/src/core/base64.ts | 27 - .../serde-layer-none/src/core/exports.ts | 1 - .../src/core/fetcher/APIResponse.ts | 23 - .../src/core/fetcher/BinaryResponse.ts | 34 - .../src/core/fetcher/EndpointMetadata.ts | 13 - .../src/core/fetcher/EndpointSupplier.ts | 14 - .../src/core/fetcher/Fetcher.ts | 391 --- .../src/core/fetcher/Headers.ts | 93 - .../src/core/fetcher/HttpResponsePromise.ts | 116 - .../src/core/fetcher/RawResponse.ts | 61 - .../src/core/fetcher/Supplier.ts | 11 - .../src/core/fetcher/createRequestUrl.ts | 6 - .../src/core/fetcher/getErrorResponseBody.ts | 33 - .../src/core/fetcher/getFetchFn.ts | 3 - .../src/core/fetcher/getHeader.ts | 8 - .../src/core/fetcher/getRequestBody.ts | 20 - .../src/core/fetcher/getResponseBody.ts | 58 - .../src/core/fetcher/index.ts | 11 - .../src/core/fetcher/makeRequest.ts | 42 - .../src/core/fetcher/requestWithRetries.ts | 64 - .../src/core/fetcher/signals.ts | 26 - .../serde-layer-none/src/core/headers.ts | 35 - .../serde-layer-none/src/core/index.ts | 6 - .../serde-layer-none/src/core/json.ts | 27 - .../src/core/logging/exports.ts | 19 - .../src/core/logging/index.ts | 1 - .../src/core/logging/logger.ts | 203 -- .../src/core/runtime/index.ts | 1 - .../src/core/runtime/runtime.ts | 134 - .../src/core/url/encodePathParam.ts | 18 - .../serde-layer-none/src/core/url/index.ts | 3 - .../serde-layer-none/src/core/url/join.ts | 79 - .../serde-layer-none/src/core/url/qs.ts | 74 - .../src/errors/SeedExhaustiveError.ts | 58 - .../src/errors/SeedExhaustiveTimeoutError.ts | 13 - .../src/errors/handleNonStatusCodeError.ts | 37 - .../serde-layer-none/src/errors/index.ts | 2 - .../serde-layer-none/src/exports.ts | 1 - .../exhaustive/serde-layer-none/src/index.ts | 5 - .../serde-layer-none/src/version.ts | 1 - .../serde-layer-none/tests/custom.test.ts | 13 - .../tests/mock-server/MockServer.ts | 29 - .../tests/mock-server/MockServerPool.ts | 106 - .../tests/mock-server/mockEndpointBuilder.ts | 227 -- .../tests/mock-server/randomBaseUrl.ts | 4 - .../tests/mock-server/setup.ts | 10 - .../tests/mock-server/withFormUrlEncoded.ts | 80 - .../tests/mock-server/withHeaders.ts | 70 - .../tests/mock-server/withJson.ts | 158 - .../serde-layer-none/tests/setup.ts | 80 - .../serde-layer-none/tests/tsconfig.json | 11 - .../tests/unit/auth/BasicAuth.test.ts | 92 - .../tests/unit/auth/BearerToken.test.ts | 14 - .../tests/unit/base64.test.ts | 53 - .../tests/unit/fetcher/Fetcher.test.ts | 261 -- .../unit/fetcher/HttpResponsePromise.test.ts | 143 - .../tests/unit/fetcher/RawResponse.test.ts | 34 - .../unit/fetcher/createRequestUrl.test.ts | 163 - .../tests/unit/fetcher/getRequestBody.test.ts | 129 - .../unit/fetcher/getResponseBody.test.ts | 97 - .../tests/unit/fetcher/logging.test.ts | 517 --- .../tests/unit/fetcher/makeRequest.test.ts | 54 - .../tests/unit/fetcher/redacting.test.ts | 1115 ------- .../unit/fetcher/requestWithRetries.test.ts | 230 -- .../tests/unit/fetcher/signals.test.ts | 69 - .../tests/unit/fetcher/test-file.txt | 1 - .../tests/unit/logging/logger.test.ts | 454 --- .../tests/unit/url/join.test.ts | 284 -- .../tests/unit/url/qs.test.ts | 278 -- .../serde-layer-none/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 - .../tests/wire/endpoints/contentType.test.ts | 88 - .../tests/wire/endpoints/enum.test.ts | 24 - .../tests/wire/endpoints/httpMethods.test.ts | 212 -- .../tests/wire/endpoints/object.test.ts | 448 --- .../tests/wire/endpoints/params.test.ts | 120 - .../tests/wire/endpoints/primitive.test.ts | 168 - .../tests/wire/endpoints/put.test.ts | 39 - .../tests/wire/endpoints/union.test.ts | 32 - .../tests/wire/endpoints/urls.test.ts | 68 - .../tests/wire/inlinedRequests.test.ts | 150 - .../tests/wire/noAuth.test.ts | 48 - .../tests/wire/noReqBody.test.ts | 58 - .../tests/wire/reqWithHeaders.test.ts | 29 - .../serde-layer-none/tsconfig.base.json | 18 - .../serde-layer-none/tsconfig.cjs.json | 9 - .../serde-layer-none/tsconfig.esm.json | 10 - .../exhaustive/serde-layer-none/tsconfig.json | 3 - .../serde-layer-none/vitest.config.mts | 28 - .../serde-layer-zod/.fern/metadata.json | 8 - .../serde-layer-zod/.github/workflows/ci.yml | 78 - .../exhaustive/serde-layer-zod/.gitignore | 3 - .../serde-layer-zod/CONTRIBUTING.md | 133 - .../exhaustive/serde-layer-zod/README.md | 241 -- .../exhaustive/serde-layer-zod/biome.json | 74 - .../exhaustive/serde-layer-zod/package.json | 80 - .../serde-layer-zod/pnpm-workspace.yaml | 1 - .../exhaustive/serde-layer-zod/reference.md | 2761 ----------------- .../scripts/rename-to-esm-files.js | 123 - .../exhaustive/serde-layer-zod/snippet.json | 544 ---- .../serde-layer-zod/src/BaseClient.ts | 82 - .../exhaustive/serde-layer-zod/src/Client.ts | 48 - .../serde-layer-zod/src/api/index.ts | 1 - .../api/resources/endpoints/client/Client.ts | 76 - .../api/resources/endpoints/client/index.ts | 1 - .../src/api/resources/endpoints/index.ts | 2 - .../resources/container/client/Client.ts | 477 --- .../resources/container/client/index.ts | 1 - .../endpoints/resources/container/index.ts | 1 - .../resources/contentType/client/Client.ts | 172 - .../resources/contentType/client/index.ts | 1 - .../endpoints/resources/contentType/index.ts | 1 - .../endpoints/resources/enum/client/Client.ts | 84 - .../endpoints/resources/enum/client/index.ts | 1 - .../endpoints/resources/enum/index.ts | 1 - .../resources/httpMethods/client/Client.ts | 341 -- .../resources/httpMethods/client/index.ts | 1 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 13 - .../resources/object/client/Client.ts | 523 ---- .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../resources/params/client/Client.ts | 535 ---- .../resources/params/client/index.ts | 1 - .../client/requests/GetWithInlinePath.ts | 11 - .../requests/GetWithInlinePathAndQuery.ts | 13 - .../client/requests/GetWithMultipleQuery.ts | 13 - .../client/requests/GetWithPathAndQuery.ts | 11 - .../params/client/requests/GetWithQuery.ts | 13 - .../requests/ModifyResourceAtInlinedPath.ts | 13 - .../resources/params/client/requests/index.ts | 6 - .../endpoints/resources/params/index.ts | 1 - .../resources/primitive/client/Client.ts | 563 ---- .../resources/primitive/client/index.ts | 1 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/client/Client.ts | 84 - .../endpoints/resources/put/client/index.ts | 1 - .../put/client/requests/PutRequest.ts | 11 - .../resources/put/client/requests/index.ts | 1 - .../endpoints/resources/put/index.ts | 2 - .../resources/put/types/ErrorCategory.ts | 8 - .../resources/put/types/ErrorCode.ts | 16 - .../endpoints/resources/put/types/Error_.ts | 10 - .../resources/put/types/PutResponse.ts | 7 - .../endpoints/resources/put/types/index.ts | 4 - .../resources/union/client/Client.ts | 85 - .../endpoints/resources/union/client/index.ts | 1 - .../endpoints/resources/union/index.ts | 1 - .../endpoints/resources/urls/client/Client.ts | 223 -- .../endpoints/resources/urls/client/index.ts | 1 - .../endpoints/resources/urls/index.ts | 1 - .../generalErrors/errors/BadRequestBody.ts | 22 - .../resources/generalErrors/errors/index.ts | 1 - .../src/api/resources/generalErrors/index.ts | 2 - .../types/BadObjectRequestInfo.ts | 5 - .../resources/generalErrors/types/index.ts | 1 - .../src/api/resources/index.ts | 11 - .../inlinedRequests/client/Client.ts | 111 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 33 - .../inlinedRequests/client/requests/index.ts | 1 - .../api/resources/inlinedRequests/index.ts | 1 - .../src/api/resources/noAuth/client/Client.ts | 93 - .../src/api/resources/noAuth/client/index.ts | 1 - .../src/api/resources/noAuth/index.ts | 1 - .../api/resources/noReqBody/client/Client.ts | 130 - .../api/resources/noReqBody/client/index.ts | 1 - .../src/api/resources/noReqBody/index.ts | 1 - .../resources/reqWithHeaders/client/Client.ts | 90 - .../resources/reqWithHeaders/client/index.ts | 1 - .../client/requests/ReqWithHeaders.ts | 15 - .../reqWithHeaders/client/requests/index.ts | 1 - .../src/api/resources/reqWithHeaders/index.ts | 1 - .../src/api/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 66 - .../types/resources/docs/types/index.ts | 1 - .../enum/errors/ErrorWithEnumBody.ts | 22 - .../types/resources/enum/errors/index.ts | 1 - .../resources/types/resources/enum/index.ts | 2 - .../resources/enum/types/WeatherReport.ts | 9 - .../types/resources/enum/types/index.ts | 1 - .../api/resources/types/resources/index.ts | 11 - .../NestedObjectWithOptionalFieldError.ts | 22 - .../NestedObjectWithRequiredFieldError.ts | 22 - .../errors/ObjectWithOptionalFieldError.ts | 22 - .../errors/ObjectWithRequiredFieldError.ts | 22 - .../types/resources/object/errors/index.ts | 4 - .../resources/types/resources/object/index.ts | 2 - .../resources/object/types/DoubleOptional.ts | 7 - .../types/NestedObjectWithOptionalField.ts | 8 - .../types/NestedObjectWithRequiredField.ts | 8 - .../object/types/ObjectWithMapOfMap.ts | 5 - .../object/types/ObjectWithOptionalField.ts | 18 - .../object/types/ObjectWithRequiredField.ts | 5 - .../resources/object/types/OptionalAlias.ts | 3 - .../types/resources/object/types/index.ts | 7 - .../union/errors/ErrorWithUnionBody.ts | 22 - .../types/resources/union/errors/index.ts | 1 - .../resources/types/resources/union/index.ts | 2 - .../types/resources/union/types/Animal.ts | 15 - .../types/resources/union/types/Cat.ts | 6 - .../types/resources/union/types/Dog.ts | 6 - .../types/resources/union/types/index.ts | 3 - .../src/auth/BearerAuthProvider.ts | 35 - .../serde-layer-zod/src/auth/index.ts | 1 - .../src/core/auth/AuthProvider.ts | 6 - .../src/core/auth/AuthRequest.ts | 9 - .../src/core/auth/BasicAuth.ts | 32 - .../src/core/auth/BearerToken.ts | 20 - .../src/core/auth/NoOpAuthProvider.ts | 8 - .../serde-layer-zod/src/core/auth/index.ts | 5 - .../serde-layer-zod/src/core/base64.ts | 27 - .../serde-layer-zod/src/core/exports.ts | 1 - .../src/core/fetcher/APIResponse.ts | 23 - .../src/core/fetcher/BinaryResponse.ts | 34 - .../src/core/fetcher/EndpointMetadata.ts | 13 - .../src/core/fetcher/EndpointSupplier.ts | 14 - .../src/core/fetcher/Fetcher.ts | 391 --- .../src/core/fetcher/Headers.ts | 93 - .../src/core/fetcher/HttpResponsePromise.ts | 116 - .../src/core/fetcher/RawResponse.ts | 61 - .../src/core/fetcher/Supplier.ts | 11 - .../src/core/fetcher/createRequestUrl.ts | 6 - .../src/core/fetcher/getErrorResponseBody.ts | 33 - .../src/core/fetcher/getFetchFn.ts | 3 - .../src/core/fetcher/getHeader.ts | 8 - .../src/core/fetcher/getRequestBody.ts | 20 - .../src/core/fetcher/getResponseBody.ts | 58 - .../serde-layer-zod/src/core/fetcher/index.ts | 11 - .../src/core/fetcher/makeRequest.ts | 42 - .../src/core/fetcher/requestWithRetries.ts | 64 - .../src/core/fetcher/signals.ts | 26 - .../serde-layer-zod/src/core/headers.ts | 35 - .../serde-layer-zod/src/core/index.ts | 6 - .../serde-layer-zod/src/core/json.ts | 27 - .../src/core/logging/exports.ts | 19 - .../serde-layer-zod/src/core/logging/index.ts | 1 - .../src/core/logging/logger.ts | 203 -- .../serde-layer-zod/src/core/runtime/index.ts | 1 - .../src/core/runtime/runtime.ts | 134 - .../src/core/url/encodePathParam.ts | 18 - .../serde-layer-zod/src/core/url/index.ts | 3 - .../serde-layer-zod/src/core/url/join.ts | 79 - .../serde-layer-zod/src/core/url/qs.ts | 74 - .../src/errors/SeedExhaustiveError.ts | 58 - .../src/errors/SeedExhaustiveTimeoutError.ts | 13 - .../src/errors/handleNonStatusCodeError.ts | 37 - .../serde-layer-zod/src/errors/index.ts | 2 - .../exhaustive/serde-layer-zod/src/exports.ts | 1 - .../exhaustive/serde-layer-zod/src/index.ts | 6 - .../src/serialization/index.ts | 1 - .../resources/endpoints/index.ts | 1 - .../client/getAndReturnListOfObjects.ts | 46 - .../client/getAndReturnListOfPrimitives.ts | 34 - .../client/getAndReturnMapOfPrimToObject.ts | 47 - .../client/getAndReturnMapPrimToPrim.ts | 36 - .../container/client/getAndReturnOptional.ts | 46 - .../client/getAndReturnSetOfObjects.ts | 46 - .../client/getAndReturnSetOfPrimitives.ts | 36 - .../resources/container/client/index.ts | 7 - .../endpoints/resources/container/index.ts | 1 - .../resources/httpMethods/client/index.ts | 2 - .../httpMethods/client/testDelete.ts | 19 - .../resources/httpMethods/client/testGet.ts | 19 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 8 - ...tAndReturnNestedWithRequiredFieldAsList.ts | 26 - .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../params/client/getWithInlinePath.ts | 19 - .../resources/params/client/getWithPath.ts | 19 - .../resources/params/client/index.ts | 4 - .../params/client/modifyWithInlinePath.ts | 34 - .../resources/params/client/modifyWithPath.ts | 34 - .../endpoints/resources/params/index.ts | 1 - .../primitive/client/getAndReturnBase64.ts | 34 - .../primitive/client/getAndReturnBool.ts | 34 - .../primitive/client/getAndReturnDate.ts | 34 - .../primitive/client/getAndReturnDatetime.ts | 34 - .../primitive/client/getAndReturnDouble.ts | 34 - .../primitive/client/getAndReturnInt.ts | 34 - .../primitive/client/getAndReturnLong.ts | 34 - .../primitive/client/getAndReturnString.ts | 34 - .../primitive/client/getAndReturnUuid.ts | 34 - .../resources/primitive/client/index.ts | 9 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/index.ts | 1 - .../resources/put/types/ErrorCategory.ts | 20 - .../resources/put/types/ErrorCode.ts | 43 - .../endpoints/resources/put/types/Error_.ts | 38 - .../resources/put/types/PutResponse.ts | 33 - .../endpoints/resources/put/types/index.ts | 4 - .../endpoints/resources/urls/client/index.ts | 4 - .../resources/urls/client/noEndingSlash.ts | 19 - .../resources/urls/client/withEndingSlash.ts | 19 - .../resources/urls/client/withMixedCase.ts | 19 - .../resources/urls/client/withUnderscores.ts | 19 - .../endpoints/resources/urls/index.ts | 1 - .../resources/generalErrors/index.ts | 1 - .../types/BadObjectRequestInfo.ts | 24 - .../resources/generalErrors/types/index.ts | 1 - .../src/serialization/resources/index.ts | 9 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 40 - .../inlinedRequests/client/requests/index.ts | 1 - .../resources/inlinedRequests/index.ts | 1 - .../resources/noAuth/client/index.ts | 1 - .../resources/noAuth/client/postWithNoAuth.ts | 19 - .../serialization/resources/noAuth/index.ts | 1 - .../resources/noReqBody/client/index.ts | 1 - .../noReqBody/client/postWithNoRequestBody.ts | 19 - .../resources/noReqBody/index.ts | 1 - .../client/getWithCustomHeader.ts | 19 - .../resources/reqWithHeaders/client/index.ts | 1 - .../resources/reqWithHeaders/index.ts | 1 - .../serialization/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 24 - .../types/resources/docs/types/index.ts | 1 - .../resources/types/resources/enum/index.ts | 1 - .../resources/enum/types/WeatherReport.ts | 20 - .../types/resources/enum/types/index.ts | 1 - .../resources/types/resources/index.ts | 8 - .../resources/types/resources/object/index.ts | 1 - .../resources/object/types/DoubleOptional.ts | 33 - .../types/NestedObjectWithOptionalField.ts | 44 - .../types/NestedObjectWithRequiredField.ts | 39 - .../object/types/ObjectWithMapOfMap.ts | 24 - .../object/types/ObjectWithOptionalField.ts | 74 - .../object/types/ObjectWithRequiredField.ts | 25 - .../resources/object/types/OptionalAlias.ts | 20 - .../types/resources/object/types/index.ts | 7 - .../resources/types/resources/union/index.ts | 1 - .../types/resources/union/types/Animal.ts | 35 - .../types/resources/union/types/Cat.ts | 26 - .../types/resources/union/types/Dog.ts | 26 - .../types/resources/union/types/index.ts | 3 - .../exhaustive/serde-layer-zod/src/version.ts | 1 - .../serde-layer-zod/tests/custom.test.ts | 13 - .../tests/mock-server/MockServer.ts | 29 - .../tests/mock-server/MockServerPool.ts | 106 - .../tests/mock-server/mockEndpointBuilder.ts | 227 -- .../tests/mock-server/randomBaseUrl.ts | 4 - .../tests/mock-server/setup.ts | 10 - .../tests/mock-server/withFormUrlEncoded.ts | 80 - .../tests/mock-server/withHeaders.ts | 70 - .../tests/mock-server/withJson.ts | 158 - .../exhaustive/serde-layer-zod/tests/setup.ts | 80 - .../serde-layer-zod/tests/tsconfig.json | 11 - .../tests/unit/auth/BasicAuth.test.ts | 92 - .../tests/unit/auth/BearerToken.test.ts | 14 - .../serde-layer-zod/tests/unit/base64.test.ts | 53 - .../tests/unit/fetcher/Fetcher.test.ts | 261 -- .../unit/fetcher/HttpResponsePromise.test.ts | 143 - .../tests/unit/fetcher/RawResponse.test.ts | 34 - .../unit/fetcher/createRequestUrl.test.ts | 163 - .../tests/unit/fetcher/getRequestBody.test.ts | 129 - .../unit/fetcher/getResponseBody.test.ts | 97 - .../tests/unit/fetcher/logging.test.ts | 517 --- .../tests/unit/fetcher/makeRequest.test.ts | 54 - .../tests/unit/fetcher/redacting.test.ts | 1115 ------- .../unit/fetcher/requestWithRetries.test.ts | 230 -- .../tests/unit/fetcher/signals.test.ts | 69 - .../tests/unit/fetcher/test-file.txt | 1 - .../tests/unit/logging/logger.test.ts | 454 --- .../tests/unit/url/join.test.ts | 284 -- .../serde-layer-zod/tests/unit/url/qs.test.ts | 278 -- .../serde-layer-zod/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 - .../tests/wire/endpoints/contentType.test.ts | 88 - .../tests/wire/endpoints/enum.test.ts | 24 - .../tests/wire/endpoints/httpMethods.test.ts | 212 -- .../tests/wire/endpoints/object.test.ts | 448 --- .../tests/wire/endpoints/params.test.ts | 120 - .../tests/wire/endpoints/primitive.test.ts | 168 - .../tests/wire/endpoints/put.test.ts | 39 - .../tests/wire/endpoints/union.test.ts | 32 - .../tests/wire/endpoints/urls.test.ts | 68 - .../tests/wire/inlinedRequests.test.ts | 150 - .../serde-layer-zod/tests/wire/noAuth.test.ts | 48 - .../tests/wire/noReqBody.test.ts | 58 - .../tests/wire/reqWithHeaders.test.ts | 29 - .../serde-layer-zod/tsconfig.base.json | 18 - .../serde-layer-zod/tsconfig.cjs.json | 9 - .../serde-layer-zod/tsconfig.esm.json | 10 - .../exhaustive/serde-layer-zod/tsconfig.json | 3 - .../serde-layer-zod/vitest.config.mts | 28 - .../serde-layer-zurg/.fern/metadata.json | 8 - .../serde-layer-zurg/.github/workflows/ci.yml | 78 - .../exhaustive/serde-layer-zurg/.gitignore | 3 - .../serde-layer-zurg/CONTRIBUTING.md | 133 - .../exhaustive/serde-layer-zurg/README.md | 241 -- .../exhaustive/serde-layer-zurg/biome.json | 74 - .../exhaustive/serde-layer-zurg/package.json | 78 - .../serde-layer-zurg/pnpm-workspace.yaml | 1 - .../exhaustive/serde-layer-zurg/reference.md | 2761 ----------------- .../scripts/rename-to-esm-files.js | 123 - .../exhaustive/serde-layer-zurg/snippet.json | 544 ---- .../serde-layer-zurg/src/BaseClient.ts | 82 - .../exhaustive/serde-layer-zurg/src/Client.ts | 48 - .../serde-layer-zurg/src/api/index.ts | 1 - .../api/resources/endpoints/client/Client.ts | 76 - .../api/resources/endpoints/client/index.ts | 1 - .../src/api/resources/endpoints/index.ts | 2 - .../resources/container/client/Client.ts | 543 ---- .../resources/container/client/index.ts | 1 - .../endpoints/resources/container/index.ts | 1 - .../resources/contentType/client/Client.ts | 178 -- .../resources/contentType/client/index.ts | 1 - .../endpoints/resources/contentType/index.ts | 1 - .../endpoints/resources/enum/client/Client.ts | 93 - .../endpoints/resources/enum/client/index.ts | 1 - .../endpoints/resources/enum/index.ts | 1 - .../resources/httpMethods/client/Client.ts | 380 --- .../resources/httpMethods/client/index.ts | 1 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 13 - .../resources/object/client/Client.ts | 577 ---- .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../resources/params/client/Client.ts | 565 ---- .../resources/params/client/index.ts | 1 - .../client/requests/GetWithInlinePath.ts | 11 - .../requests/GetWithInlinePathAndQuery.ts | 13 - .../client/requests/GetWithMultipleQuery.ts | 13 - .../client/requests/GetWithPathAndQuery.ts | 11 - .../params/client/requests/GetWithQuery.ts | 13 - .../requests/ModifyResourceAtInlinedPath.ts | 13 - .../resources/params/client/requests/index.ts | 6 - .../endpoints/resources/params/index.ts | 1 - .../resources/primitive/client/Client.ts | 644 ---- .../resources/primitive/client/index.ts | 1 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/client/Client.ts | 90 - .../endpoints/resources/put/client/index.ts | 1 - .../put/client/requests/PutRequest.ts | 11 - .../resources/put/client/requests/index.ts | 1 - .../endpoints/resources/put/index.ts | 2 - .../resources/put/types/ErrorCategory.ts | 8 - .../resources/put/types/ErrorCode.ts | 16 - .../endpoints/resources/put/types/Error_.ts | 10 - .../resources/put/types/PutResponse.ts | 7 - .../endpoints/resources/put/types/index.ts | 4 - .../resources/union/client/Client.ts | 97 - .../endpoints/resources/union/client/index.ts | 1 - .../endpoints/resources/union/index.ts | 1 - .../endpoints/resources/urls/client/Client.ts | 247 -- .../endpoints/resources/urls/client/index.ts | 1 - .../endpoints/resources/urls/index.ts | 1 - .../generalErrors/errors/BadRequestBody.ts | 22 - .../resources/generalErrors/errors/index.ts | 1 - .../src/api/resources/generalErrors/index.ts | 2 - .../types/BadObjectRequestInfo.ts | 5 - .../resources/generalErrors/types/index.ts | 1 - .../src/api/resources/index.ts | 11 - .../inlinedRequests/client/Client.ts | 126 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 33 - .../inlinedRequests/client/requests/index.ts | 1 - .../api/resources/inlinedRequests/index.ts | 1 - .../src/api/resources/noAuth/client/Client.ts | 105 - .../src/api/resources/noAuth/client/index.ts | 1 - .../src/api/resources/noAuth/index.ts | 1 - .../api/resources/noReqBody/client/Client.ts | 142 - .../api/resources/noReqBody/client/index.ts | 1 - .../src/api/resources/noReqBody/index.ts | 1 - .../resources/reqWithHeaders/client/Client.ts | 93 - .../resources/reqWithHeaders/client/index.ts | 1 - .../client/requests/ReqWithHeaders.ts | 15 - .../reqWithHeaders/client/requests/index.ts | 1 - .../src/api/resources/reqWithHeaders/index.ts | 1 - .../src/api/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 66 - .../types/resources/docs/types/index.ts | 1 - .../enum/errors/ErrorWithEnumBody.ts | 22 - .../types/resources/enum/errors/index.ts | 1 - .../resources/types/resources/enum/index.ts | 2 - .../resources/enum/types/WeatherReport.ts | 9 - .../types/resources/enum/types/index.ts | 1 - .../api/resources/types/resources/index.ts | 11 - .../NestedObjectWithOptionalFieldError.ts | 22 - .../NestedObjectWithRequiredFieldError.ts | 22 - .../errors/ObjectWithOptionalFieldError.ts | 22 - .../errors/ObjectWithRequiredFieldError.ts | 22 - .../types/resources/object/errors/index.ts | 4 - .../resources/types/resources/object/index.ts | 2 - .../resources/object/types/DoubleOptional.ts | 7 - .../types/NestedObjectWithOptionalField.ts | 8 - .../types/NestedObjectWithRequiredField.ts | 8 - .../object/types/ObjectWithMapOfMap.ts | 5 - .../object/types/ObjectWithOptionalField.ts | 18 - .../object/types/ObjectWithRequiredField.ts | 5 - .../resources/object/types/OptionalAlias.ts | 3 - .../types/resources/object/types/index.ts | 7 - .../union/errors/ErrorWithUnionBody.ts | 22 - .../types/resources/union/errors/index.ts | 1 - .../resources/types/resources/union/index.ts | 2 - .../types/resources/union/types/Animal.ts | 15 - .../types/resources/union/types/Cat.ts | 6 - .../types/resources/union/types/Dog.ts | 6 - .../types/resources/union/types/index.ts | 3 - .../src/auth/BearerAuthProvider.ts | 35 - .../serde-layer-zurg/src/auth/index.ts | 1 - .../src/core/auth/AuthProvider.ts | 6 - .../src/core/auth/AuthRequest.ts | 9 - .../src/core/auth/BasicAuth.ts | 32 - .../src/core/auth/BearerToken.ts | 20 - .../src/core/auth/NoOpAuthProvider.ts | 8 - .../serde-layer-zurg/src/core/auth/index.ts | 5 - .../serde-layer-zurg/src/core/base64.ts | 27 - .../serde-layer-zurg/src/core/exports.ts | 1 - .../src/core/fetcher/APIResponse.ts | 23 - .../src/core/fetcher/BinaryResponse.ts | 34 - .../src/core/fetcher/EndpointMetadata.ts | 13 - .../src/core/fetcher/EndpointSupplier.ts | 14 - .../src/core/fetcher/Fetcher.ts | 391 --- .../src/core/fetcher/Headers.ts | 93 - .../src/core/fetcher/HttpResponsePromise.ts | 116 - .../src/core/fetcher/RawResponse.ts | 61 - .../src/core/fetcher/Supplier.ts | 11 - .../src/core/fetcher/createRequestUrl.ts | 6 - .../src/core/fetcher/getErrorResponseBody.ts | 33 - .../src/core/fetcher/getFetchFn.ts | 3 - .../src/core/fetcher/getHeader.ts | 8 - .../src/core/fetcher/getRequestBody.ts | 20 - .../src/core/fetcher/getResponseBody.ts | 58 - .../src/core/fetcher/index.ts | 11 - .../src/core/fetcher/makeRequest.ts | 42 - .../src/core/fetcher/requestWithRetries.ts | 64 - .../src/core/fetcher/signals.ts | 26 - .../serde-layer-zurg/src/core/headers.ts | 35 - .../serde-layer-zurg/src/core/index.ts | 7 - .../serde-layer-zurg/src/core/json.ts | 27 - .../src/core/logging/exports.ts | 19 - .../src/core/logging/index.ts | 1 - .../src/core/logging/logger.ts | 203 -- .../src/core/runtime/index.ts | 1 - .../src/core/runtime/runtime.ts | 134 - .../src/core/schemas/Schema.ts | 103 - .../core/schemas/builders/bigint/bigint.ts | 55 - .../src/core/schemas/builders/bigint/index.ts | 1 - .../src/core/schemas/builders/date/date.ts | 65 - .../src/core/schemas/builders/date/index.ts | 1 - .../src/core/schemas/builders/enum/enum.ts | 43 - .../src/core/schemas/builders/enum/index.ts | 1 - .../src/core/schemas/builders/index.ts | 14 - .../src/core/schemas/builders/lazy/index.ts | 3 - .../src/core/schemas/builders/lazy/lazy.ts | 32 - .../core/schemas/builders/lazy/lazyObject.ts | 20 - .../src/core/schemas/builders/list/index.ts | 1 - .../src/core/schemas/builders/list/list.ts | 73 - .../builders/literals/booleanLiteral.ts | 29 - .../core/schemas/builders/literals/index.ts | 2 - .../builders/literals/stringLiteral.ts | 29 - .../object-like/getObjectLikeUtils.ts | 79 - .../schemas/builders/object-like/index.ts | 2 - .../schemas/builders/object-like/types.ts | 13 - .../src/core/schemas/builders/object/index.ts | 22 - .../core/schemas/builders/object/object.ts | 382 --- .../object/objectWithoutOptionalProperties.ts | 23 - .../core/schemas/builders/object/property.ts | 23 - .../src/core/schemas/builders/object/types.ts | 73 - .../core/schemas/builders/primitives/any.ts | 7 - .../schemas/builders/primitives/boolean.ts | 25 - .../core/schemas/builders/primitives/index.ts | 6 - .../core/schemas/builders/primitives/never.ts | 15 - .../schemas/builders/primitives/number.ts | 25 - .../schemas/builders/primitives/string.ts | 25 - .../schemas/builders/primitives/unknown.ts | 7 - .../src/core/schemas/builders/record/index.ts | 2 - .../core/schemas/builders/record/record.ts | 129 - .../src/core/schemas/builders/record/types.ts | 17 - .../builders/schema-utils/JsonError.ts | 9 - .../builders/schema-utils/ParseError.ts | 9 - .../builders/schema-utils/getSchemaUtils.ts | 181 -- .../schemas/builders/schema-utils/index.ts | 4 - .../schema-utils/stringifyValidationErrors.ts | 8 - .../src/core/schemas/builders/set/index.ts | 1 - .../src/core/schemas/builders/set/set.ts | 43 - .../builders/undiscriminated-union/index.ts | 6 - .../builders/undiscriminated-union/types.ts | 10 - .../undiscriminatedUnion.ts | 67 - .../schemas/builders/union/discriminant.ts | 14 - .../src/core/schemas/builders/union/index.ts | 10 - .../src/core/schemas/builders/union/types.ts | 26 - .../src/core/schemas/builders/union/union.ts | 176 -- .../src/core/schemas/index.ts | 2 - .../src/core/schemas/utils/MaybePromise.ts | 1 - .../addQuestionMarksToNullableProperties.ts | 9 - .../utils/createIdentitySchemaCreator.ts | 21 - .../src/core/schemas/utils/entries.ts | 3 - .../src/core/schemas/utils/filterObject.ts | 13 - .../utils/getErrorMessageForIncorrectType.ts | 25 - .../src/core/schemas/utils/isPlainObject.ts | 17 - .../src/core/schemas/utils/keys.ts | 3 - .../core/schemas/utils/maybeSkipValidation.ts | 38 - .../src/core/schemas/utils/partition.ts | 12 - .../src/core/url/encodePathParam.ts | 18 - .../serde-layer-zurg/src/core/url/index.ts | 3 - .../serde-layer-zurg/src/core/url/join.ts | 79 - .../serde-layer-zurg/src/core/url/qs.ts | 74 - .../src/errors/SeedExhaustiveError.ts | 58 - .../src/errors/SeedExhaustiveTimeoutError.ts | 13 - .../src/errors/handleNonStatusCodeError.ts | 37 - .../serde-layer-zurg/src/errors/index.ts | 2 - .../serde-layer-zurg/src/exports.ts | 1 - .../exhaustive/serde-layer-zurg/src/index.ts | 6 - .../src/serialization/index.ts | 1 - .../resources/endpoints/index.ts | 1 - .../client/getAndReturnListOfObjects.ts | 24 - .../client/getAndReturnListOfPrimitives.ts | 22 - .../client/getAndReturnMapOfPrimToObject.ts | 24 - .../client/getAndReturnMapPrimToPrim.ts | 22 - .../container/client/getAndReturnOptional.ts | 24 - .../client/getAndReturnSetOfObjects.ts | 24 - .../client/getAndReturnSetOfPrimitives.ts | 22 - .../resources/container/client/index.ts | 7 - .../endpoints/resources/container/index.ts | 1 - .../resources/httpMethods/client/index.ts | 2 - .../httpMethods/client/testDelete.ts | 11 - .../resources/httpMethods/client/testGet.ts | 11 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 8 - ...tAndReturnNestedWithRequiredFieldAsList.ts | 15 - .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../params/client/getWithInlinePath.ts | 11 - .../resources/params/client/getWithPath.ts | 11 - .../resources/params/client/index.ts | 4 - .../params/client/modifyWithInlinePath.ts | 18 - .../resources/params/client/modifyWithPath.ts | 18 - .../endpoints/resources/params/index.ts | 1 - .../primitive/client/getAndReturnBase64.ts | 18 - .../primitive/client/getAndReturnBool.ts | 18 - .../primitive/client/getAndReturnDate.ts | 18 - .../primitive/client/getAndReturnDatetime.ts | 18 - .../primitive/client/getAndReturnDouble.ts | 18 - .../primitive/client/getAndReturnInt.ts | 18 - .../primitive/client/getAndReturnLong.ts | 18 - .../primitive/client/getAndReturnString.ts | 18 - .../primitive/client/getAndReturnUuid.ts | 18 - .../resources/primitive/client/index.ts | 9 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/index.ts | 1 - .../resources/put/types/ErrorCategory.ts | 14 - .../resources/put/types/ErrorCode.ts | 35 - .../endpoints/resources/put/types/Error_.ts | 24 - .../resources/put/types/PutResponse.ts | 19 - .../endpoints/resources/put/types/index.ts | 4 - .../endpoints/resources/urls/client/index.ts | 4 - .../resources/urls/client/noEndingSlash.ts | 11 - .../resources/urls/client/withEndingSlash.ts | 11 - .../resources/urls/client/withMixedCase.ts | 11 - .../resources/urls/client/withUnderscores.ts | 11 - .../endpoints/resources/urls/index.ts | 1 - .../resources/generalErrors/index.ts | 1 - .../types/BadObjectRequestInfo.ts | 18 - .../resources/generalErrors/types/index.ts | 1 - .../src/serialization/resources/index.ts | 9 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 23 - .../inlinedRequests/client/requests/index.ts | 1 - .../resources/inlinedRequests/index.ts | 1 - .../resources/noAuth/client/index.ts | 1 - .../resources/noAuth/client/postWithNoAuth.ts | 11 - .../serialization/resources/noAuth/index.ts | 1 - .../resources/noReqBody/client/index.ts | 1 - .../noReqBody/client/postWithNoRequestBody.ts | 11 - .../resources/noReqBody/index.ts | 1 - .../client/getWithCustomHeader.ts | 11 - .../resources/reqWithHeaders/client/index.ts | 1 - .../resources/reqWithHeaders/index.ts | 1 - .../serialization/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 18 - .../types/resources/docs/types/index.ts | 1 - .../resources/types/resources/enum/index.ts | 1 - .../resources/enum/types/WeatherReport.ts | 14 - .../types/resources/enum/types/index.ts | 1 - .../resources/types/resources/index.ts | 8 - .../resources/types/resources/object/index.ts | 1 - .../resources/object/types/DoubleOptional.ts | 19 - .../types/NestedObjectWithOptionalField.ts | 21 - .../types/NestedObjectWithRequiredField.ts | 21 - .../object/types/ObjectWithMapOfMap.ts | 21 - .../object/types/ObjectWithOptionalField.ts | 42 - .../object/types/ObjectWithRequiredField.ts | 18 - .../resources/object/types/OptionalAlias.ts | 14 - .../types/resources/object/types/index.ts | 7 - .../resources/types/resources/union/index.ts | 1 - .../types/resources/union/types/Animal.ts | 29 - .../types/resources/union/types/Cat.ts | 18 - .../types/resources/union/types/Dog.ts | 18 - .../types/resources/union/types/index.ts | 3 - .../serde-layer-zurg/src/version.ts | 1 - .../serde-layer-zurg/tests/custom.test.ts | 13 - .../tests/mock-server/MockServer.ts | 29 - .../tests/mock-server/MockServerPool.ts | 106 - .../tests/mock-server/mockEndpointBuilder.ts | 227 -- .../tests/mock-server/randomBaseUrl.ts | 4 - .../tests/mock-server/setup.ts | 10 - .../tests/mock-server/withFormUrlEncoded.ts | 80 - .../tests/mock-server/withHeaders.ts | 70 - .../tests/mock-server/withJson.ts | 158 - .../serde-layer-zurg/tests/setup.ts | 80 - .../serde-layer-zurg/tests/tsconfig.json | 11 - .../tests/unit/auth/BasicAuth.test.ts | 92 - .../tests/unit/auth/BearerToken.test.ts | 14 - .../tests/unit/base64.test.ts | 53 - .../tests/unit/fetcher/Fetcher.test.ts | 261 -- .../unit/fetcher/HttpResponsePromise.test.ts | 143 - .../tests/unit/fetcher/RawResponse.test.ts | 34 - .../unit/fetcher/createRequestUrl.test.ts | 163 - .../tests/unit/fetcher/getRequestBody.test.ts | 129 - .../unit/fetcher/getResponseBody.test.ts | 97 - .../tests/unit/fetcher/logging.test.ts | 517 --- .../tests/unit/fetcher/makeRequest.test.ts | 54 - .../tests/unit/fetcher/redacting.test.ts | 1115 ------- .../unit/fetcher/requestWithRetries.test.ts | 230 -- .../tests/unit/fetcher/signals.test.ts | 69 - .../tests/unit/fetcher/test-file.txt | 1 - .../tests/unit/logging/logger.test.ts | 454 --- .../tests/unit/schemas/bigint/bigint.test.ts | 46 - .../tests/unit/schemas/date/date.test.ts | 31 - .../tests/unit/schemas/enum/enum.test.ts | 30 - .../tests/unit/schemas/lazy/lazy.test.ts | 57 - .../unit/schemas/lazy/lazyObject.test.ts | 18 - .../tests/unit/schemas/lazy/recursive/a.ts | 7 - .../tests/unit/schemas/lazy/recursive/b.ts | 8 - .../tests/unit/schemas/list/list.test.ts | 41 - .../schemas/literals/stringLiteral.test.ts | 21 - .../object-like/withParsedProperties.test.ts | 57 - .../tests/unit/schemas/object/extend.test.ts | 89 - .../tests/unit/schemas/object/object.test.ts | 255 -- .../objectWithoutOptionalProperties.test.ts | 21 - .../unit/schemas/object/passthrough.test.ts | 87 - .../tests/unit/schemas/primitives/any.test.ts | 6 - .../unit/schemas/primitives/boolean.test.ts | 14 - .../unit/schemas/primitives/never.test.ts | 54 - .../unit/schemas/primitives/number.test.ts | 14 - .../unit/schemas/primitives/string.test.ts | 14 - .../unit/schemas/primitives/unknown.test.ts | 6 - .../tests/unit/schemas/record/record.test.ts | 34 - .../schema-utils/getSchemaUtils.test.ts | 83 - .../tests/unit/schemas/schema.test.ts | 78 - .../tests/unit/schemas/set/set.test.ts | 48 - .../tests/unit/schemas/skipValidation.test.ts | 44 - .../undiscriminatedUnion.test.ts | 44 - .../tests/unit/schemas/union/union.test.ts | 113 - .../tests/unit/schemas/utils/itSchema.ts | 78 - .../tests/unit/schemas/utils/itValidate.ts | 56 - .../tests/unit/url/join.test.ts | 284 -- .../tests/unit/url/qs.test.ts | 278 -- .../serde-layer-zurg/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 - .../tests/wire/endpoints/contentType.test.ts | 88 - .../tests/wire/endpoints/enum.test.ts | 24 - .../tests/wire/endpoints/httpMethods.test.ts | 212 -- .../tests/wire/endpoints/object.test.ts | 448 --- .../tests/wire/endpoints/params.test.ts | 120 - .../tests/wire/endpoints/primitive.test.ts | 168 - .../tests/wire/endpoints/put.test.ts | 39 - .../tests/wire/endpoints/union.test.ts | 32 - .../tests/wire/endpoints/urls.test.ts | 68 - .../tests/wire/inlinedRequests.test.ts | 150 - .../tests/wire/noAuth.test.ts | 48 - .../tests/wire/noReqBody.test.ts | 58 - .../tests/wire/reqWithHeaders.test.ts | 29 - .../serde-layer-zurg/tsconfig.base.json | 18 - .../serde-layer-zurg/tsconfig.cjs.json | 9 - .../serde-layer-zurg/tsconfig.esm.json | 10 - .../exhaustive/serde-layer-zurg/tsconfig.json | 3 - .../serde-layer-zurg/vitest.config.mts | 28 - 898 files changed, 56571 deletions(-) delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.gitignore delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/README.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/biome.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/package.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/reference.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/snippet.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/README.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/biome.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/package.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/reference.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/README.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/package.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json deleted file mode 100644 index 48f29b85d5d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "cliVersion": "DUMMY", - "generatorName": "fernapi/fern-typescript-sdk", - "generatorVersion": "latest", - "generatorConfig": { - "serializationFormat": "none" - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml deleted file mode 100644 index 836106996595..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: ci - -on: [push] - -jobs: - compile: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Compile - run: pnpm build - - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Test - run: pnpm test - - publish: - needs: [ compile, test ] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build - run: pnpm build - - - name: Publish to npm - run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - publish() { # use latest npm to ensure OIDC support - npx -y npm@latest publish "$@" - } - if [[ ${GITHUB_REF} == *alpha* ]]; then - publish --access public --tag alpha - elif [[ ${GITHUB_REF} == *beta* ]]; then - publish --access public --tag beta - else - publish --access public - fi - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore deleted file mode 100644 index 72271e049c02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.DS_Store -/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md deleted file mode 100644 index fe5bc2f77e0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md +++ /dev/null @@ -1,133 +0,0 @@ -# Contributing - -Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. - -## Getting Started - -### Prerequisites - -- Node.js 20 or higher -- pnpm package manager - -### Installation - -Install the project dependencies: - -```bash -pnpm install -``` - -### Building - -Build the project: - -```bash -pnpm build -``` - -### Testing - -Run the test suite: - -```bash -pnpm test -``` - -Run specific test types: -- `pnpm test:unit` - Run unit tests -- `pnpm test:wire` - Run wire/integration tests - -### Linting and Formatting - -Check code style: - -```bash -pnpm run lint -pnpm run format:check -``` - -Fix code style issues: - -```bash -pnpm run lint:fix -pnpm run format:fix -``` - -Or use the combined check command: - -```bash -pnpm run check:fix -``` - -## About Generated Code - -**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. - -### Generated Files - -The following directories contain generated code: -- `src/api/` - API client classes and types -- `src/serialization/` - Serialization/deserialization logic -- Most TypeScript files in `src/` - -### How to Customize - -If you need to customize the SDK, you have two options: - -#### Option 1: Use `.fernignore` - -For custom code that should persist across SDK regenerations: - -1. Create a `.fernignore` file in the project root -2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) -3. Add your custom code to those files - -Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. - -For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). - -#### Option 2: Contribute to the Generator - -If you want to change how code is generated for all users of this SDK: - -1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) -2. Generator code is located at `generators/typescript/sdk/` -3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) -4. Submit a pull request with your changes to the generator - -This approach is best for: -- Bug fixes in generated code -- New features that would benefit all users -- Improvements to code generation patterns - -## Making Changes - -### Workflow - -1. Create a new branch for your changes -2. Make your modifications -3. Run tests to ensure nothing breaks: `pnpm test` -4. Run linting and formatting: `pnpm run check:fix` -5. Build the project: `pnpm build` -6. Commit your changes with a clear commit message -7. Push your branch and create a pull request - -### Commit Messages - -Write clear, descriptive commit messages that explain what changed and why. - -### Code Style - -This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. - -## Questions or Issues? - -If you have questions or run into issues: - -1. Check the [Fern documentation](https://buildwithfern.com) -2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) -3. Open a new issue if your question hasn't been addressed - -## License - -By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/README.md b/seed/ts-sdk/exhaustive/serde-layer-none/README.md deleted file mode 100644 index 140b1fb505f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/README.md +++ /dev/null @@ -1,241 +0,0 @@ -# Seed TypeScript Library - -[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) -[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) - -The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. - -## Installation - -```sh -npm i -s @fern/exhaustive -``` - -## Reference - -A full reference for this library is available [here](./reference.md). - -## Usage - -Instantiate and use the client with the following: - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); -``` - -## Request And Response Types - -The SDK exports all request and response types as TypeScript interfaces. Simply import them with the -following namespace: - -```typescript -import { SeedExhaustive } from "@fern/exhaustive"; - -const request: SeedExhaustive.GetWithInlinePath = { - ... -}; -``` - -## Exception Handling - -When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error -will be thrown. - -```typescript -import { SeedExhaustiveError } from "@fern/exhaustive"; - -try { - await client.endpoints.container.getAndReturnListOfPrimitives(...); -} catch (err) { - if (err instanceof SeedExhaustiveError) { - console.log(err.statusCode); - console.log(err.message); - console.log(err.body); - console.log(err.rawResponse); - } -} -``` - -## Advanced - -### Additional Headers - -If you would like to send additional headers as part of the request, use the `headers` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - headers: { - 'X-Custom-Header': 'custom value' - } -}); -``` - -### Additional Query String Parameters - -If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - queryParams: { - 'customQueryParamKey': 'custom query param value' - } -}); -``` - -### Retries - -The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long -as the request is deemed retryable and the number of retry attempts has not grown larger than the configured -retry limit (default: 2). - -A request is deemed retryable when any of the following HTTP status codes is returned: - -- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) -- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) -- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) - -Use the `maxRetries` request option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - maxRetries: 0 // override maxRetries at the request level -}); -``` - -### Timeouts - -The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - timeoutInSeconds: 30 // override timeout to 30s -}); -``` - -### Aborting Requests - -The SDK allows users to abort requests at any point by passing in an abort signal. - -```typescript -const controller = new AbortController(); -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - abortSignal: controller.signal -}); -controller.abort(); // aborts the request -``` - -### Access Raw Response Data - -The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. -The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. - -```typescript -const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); - -console.log(data); -console.log(rawResponse.headers['X-My-Header']); -``` - -### Logging - -The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. - -```typescript -import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - logging: { - level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info - logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger - silent: false, // defaults to true, set to false to enable logging - } -}); -``` -The `logging` object can have the following properties: -- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. -- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. -- `silent`: Whether to silence the logger. Defaults to `true`. - -The `level` property can be one of the following values: -- `logging.LogLevel.Debug` -- `logging.LogLevel.Info` -- `logging.LogLevel.Warn` -- `logging.LogLevel.Error` - -To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. - -

-Custom logger examples - -Here's an example using the popular `winston` logging library. -```ts -import winston from 'winston'; - -const winstonLogger = winston.createLogger({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => winstonLogger.debug(msg, ...args), - info: (msg, ...args) => winstonLogger.info(msg, ...args), - warn: (msg, ...args) => winstonLogger.warn(msg, ...args), - error: (msg, ...args) => winstonLogger.error(msg, ...args), -}; -``` - -Here's an example using the popular `pino` logging library. - -```ts -import pino from 'pino'; - -const pinoLogger = pino({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => pinoLogger.debug(args, msg), - info: (msg, ...args) => pinoLogger.info(args, msg), - warn: (msg, ...args) => pinoLogger.warn(args, msg), - error: (msg, ...args) => pinoLogger.error(args, msg), -}; -``` -
- - -### Runtime Compatibility - - -The SDK works in the following runtimes: - - - -- Node.js 18+ -- Vercel -- Cloudflare Workers -- Deno v1.25+ -- Bun 1.0+ -- React Native - -### Customizing Fetch Client - -The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an -unsupported environment, this provides a way for you to break glass and ensure the SDK works. - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - fetcher: // provide your implementation here -}); -``` - -## Contributing - -While we value open-source contributions to this SDK, this library is generated programmatically. -Additions made directly to this library would have to be moved over to our generation code, -otherwise they would be overwritten upon the next generated release. Feel free to open a PR as -a proof of concept, but know that we will not be able to merge it as-is. We suggest opening -an issue first to discuss with us! - -On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/biome.json b/seed/ts-sdk/exhaustive/serde-layer-none/biome.json deleted file mode 100644 index a777468e4ae2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/biome.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", - "root": true, - "vcs": { - "enabled": false - }, - "files": { - "ignoreUnknown": true, - "includes": [ - "**", - "!!dist", - "!!**/dist", - "!!lib", - "!!**/lib", - "!!_tmp_*", - "!!**/_tmp_*", - "!!*.tmp", - "!!**/*.tmp", - "!!.tmp/", - "!!**/.tmp/", - "!!*.log", - "!!**/*.log", - "!!**/.DS_Store", - "!!**/Thumbs.db" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 4, - "lineWidth": 120 - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - }, - "linter": { - "rules": { - "style": { - "useNodejsImportProtocol": "off" - }, - "suspicious": { - "noAssignInExpressions": "warn", - "noUselessEscapeInString": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noThenProperty": "warn", - "useIterableCallbackReturn": "warn", - "noShadowRestrictedNames": "warn", - "noTsIgnore": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noConfusingVoidType": { - "level": "warn", - "fix": "none", - "options": {} - } - } - } - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/package.json b/seed/ts-sdk/exhaustive/serde-layer-none/package.json deleted file mode 100644 index d78462fbefd6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "@fern/exhaustive", - "version": "0.0.1", - "private": false, - "repository": "github:exhaustive/fern", - "type": "commonjs", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.mjs", - "types": "./dist/cjs/index.d.ts", - "exports": { - ".": { - "types": "./dist/cjs/index.d.ts", - "import": { - "types": "./dist/esm/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - }, - "default": "./dist/cjs/index.js" - }, - "./package.json": "./package.json" - }, - "files": [ - "dist", - "reference.md", - "README.md", - "LICENSE" - ], - "scripts": { - "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "build": "pnpm build:cjs && pnpm build:esm", - "build:cjs": "tsc --project ./tsconfig.cjs.json", - "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", - "test": "vitest", - "test:unit": "vitest --project unit", - "test:wire": "vitest --project wire" - }, - "dependencies": {}, - "devDependencies": { - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", - "vitest": "^3.2.4", - "msw": "2.11.2", - "@types/node": "^18.19.70", - "typescript": "~5.7.2", - "@biomejs/biome": "2.3.1" - }, - "browser": { - "fs": false, - "os": false, - "path": false, - "stream": false - }, - "packageManager": "pnpm@10.20.0", - "engines": { - "node": ">=18.0.0" - }, - "sideEffects": false -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml deleted file mode 100644 index 6e4c395107df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml +++ /dev/null @@ -1 +0,0 @@ -packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/reference.md b/seed/ts-sdk/exhaustive/serde-layer-none/reference.md deleted file mode 100644 index c7d4e874e8a2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/reference.md +++ /dev/null @@ -1,2761 +0,0 @@ -# Reference -## Endpoints Container -
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfObjects([{ - string: "string" - }, { - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfObjects([{ - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapPrimToPrim({ - "string": "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapOfPrimToObject({ - "string": { - string: "string" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnOptional({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints ContentType -
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Enum -
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.enum.getAndReturnEnum("SUNNY"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.WeatherReport` - -
-
- -
-
- -**requestOptions:** `EnumClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints HttpMethods -
client.endpoints.httpMethods.testGet(id) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testGet("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPost({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPut("id", { - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testDelete(id) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testDelete("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Object -
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - "map": { - "map": "map" - } - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithMapOfMap` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**string:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } - }, { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Params -
client.endpoints.params.getWithPath(param) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPath("param"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePath({ - param: "param" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with multiple of same query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPathAndQuery("param", { - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithPath(param, { ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithPath("param", "string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Primitive -
client.endpoints.primitive.getAndReturnString({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnString("string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnInt(1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnLong(1000000); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDouble(1.1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBool(true); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `boolean` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Put -
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.put.add({ - id: "id" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.PutRequest` - -
-
- -
-
- -**requestOptions:** `PutClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Union -
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.Animal` - -
-
- -
-
- -**requestOptions:** `UnionClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Urls -
client.endpoints.urls.withMixedCase() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withMixedCase(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.noEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.noEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withUnderscores() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withUnderscores(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## InlinedRequests -
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 📝 Description - -
-
- -
-
- -POST with custom object in request body, response is an object -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.PostWithObjectBody` - -
-
- -
-
- -**requestOptions:** `InlinedRequestsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoAuth -
client.noAuth.postWithNoAuth({ ...params }) -> boolean -
-
- -#### 📝 Description - -
-
- -
-
- -POST request with no auth -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noAuth.postWithNoAuth({ - "key": "value" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `unknown` - -
-
- -
-
- -**requestOptions:** `NoAuthClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoReqBody -
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.getWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.noReqBody.postWithNoRequestBody() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.postWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## ReqWithHeaders -
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.reqWithHeaders.getWithCustomHeader({ - "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ReqWithHeaders` - -
-
- -
-
- -**requestOptions:** `ReqWithHeadersClient.RequestOptions` - -
-
-
-
- - -
-
-
diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js deleted file mode 100644 index dc1df1cbbacb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs").promises; -const path = require("path"); - -const extensionMap = { - ".js": ".mjs", - ".d.ts": ".d.mts", -}; -const oldExtensions = Object.keys(extensionMap); - -async function findFiles(rootPath) { - const files = []; - - async function scan(directory) { - const entries = await fs.readdir(directory, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(directory, entry.name); - - if (entry.isDirectory()) { - if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { - await scan(fullPath); - } - } else if (entry.isFile()) { - if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { - files.push(fullPath); - } - } - } - } - - await scan(rootPath); - return files; -} - -async function updateFiles(files) { - const updatedFiles = []; - for (const file of files) { - const updated = await updateFileContents(file); - updatedFiles.push(updated); - } - - console.log(`Updated imports in ${updatedFiles.length} files.`); -} - -async function updateFileContents(file) { - const content = await fs.readFile(file, "utf8"); - - let newContent = content; - // Update each extension type defined in the map - for (const [oldExt, newExt] of Object.entries(extensionMap)) { - // Handle static imports/exports - const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); - newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); - - // Handle dynamic imports (yield import, await import, regular import()) - const dynamicRegex = new RegExp( - `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, - "g", - ); - newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); - } - - if (content !== newContent) { - await fs.writeFile(file, newContent, "utf8"); - return true; - } - return false; -} - -async function renameFiles(files) { - let counter = 0; - for (const file of files) { - const ext = oldExtensions.find((ext) => file.endsWith(ext)); - const newExt = extensionMap[ext]; - - if (newExt) { - const newPath = file.slice(0, -ext.length) + newExt; - await fs.rename(file, newPath); - counter++; - } - } - - console.log(`Renamed ${counter} files.`); -} - -async function main() { - try { - const targetDir = process.argv[2]; - if (!targetDir) { - console.error("Please provide a target directory"); - process.exit(1); - } - - const targetPath = path.resolve(targetDir); - const targetStats = await fs.stat(targetPath); - - if (!targetStats.isDirectory()) { - console.error("The provided path is not a directory"); - process.exit(1); - } - - console.log(`Scanning directory: ${targetDir}`); - - const files = await findFiles(targetDir); - - if (files.length === 0) { - console.log("No matching files found."); - process.exit(0); - } - - console.log(`Found ${files.length} files.`); - await updateFiles(files); - await renameFiles(files); - console.log("\nDone!"); - } catch (error) { - console.error("An error occurred:", error.message); - process.exit(1); - } -} - -main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json deleted file mode 100644 index 33399dc5484e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "endpoints": [ - { - "id": { - "path": "/container/list-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" - } - }, - { - "id": { - "path": "/container/list-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/set-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives([\"string\"]);\n" - } - }, - { - "id": { - "path": "/container/set-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-prim", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-object", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" - } - }, - { - "id": { - "path": "/container/opt-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/foo/bar", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/foo/baz", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/enum", - "method": "POST", - "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "GET", - "identifier_override": "endpoint_endpoints/http-methods.testGet" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" - } - }, - { - "id": { - "path": "/http-methods", - "method": "POST", - "identifier_override": "endpoint_endpoints/http-methods.testPost" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/http-methods.testPut" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PATCH", - "identifier_override": "endpoint_endpoints/http-methods.testPatch" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "DELETE", - "identifier_override": "endpoint_endpoints/http-methods.testDelete" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-required-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-map-of-map", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field/{string}", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field-list", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/primitive/string", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" - } - }, - { - "id": { - "path": "/primitive/integer", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" - } - }, - { - "id": { - "path": "/primitive/long", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" - } - }, - { - "id": { - "path": "/primitive/double", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" - } - }, - { - "id": { - "path": "/primitive/boolean", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" - } - }, - { - "id": { - "path": "/primitive/datetime", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(\"2024-01-15T09:30:00Z\");\n" - } - }, - { - "id": { - "path": "/primitive/date", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" - } - }, - { - "id": { - "path": "/primitive/uuid", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" - } - }, - { - "id": { - "path": "/primitive/base64", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" - } - }, - { - "id": { - "path": "/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/put.add" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" - } - }, - { - "id": { - "path": "/union", - "method": "POST", - "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" - } - }, - { - "id": { - "path": "/urls/MixedCase", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withMixedCase" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" - } - }, - { - "id": { - "path": "/urls/no-ending-slash", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.noEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with-ending-slash/", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with_underscores", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withUnderscores" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" - } - }, - { - "id": { - "path": "/req-bodies/object", - "method": "POST", - "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/no-auth", - "method": "POST", - "identifier_override": "endpoint_no-auth.postWithNoAuth" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "GET", - "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "POST", - "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/test-headers/custom-header", - "method": "POST", - "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n \"X-TEST-SERVICE-HEADER\": \"X-TEST-SERVICE-HEADER\",\n \"X-TEST-ENDPOINT-HEADER\": \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" - } - } - ], - "types": {} -} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts deleted file mode 100644 index f28de2b4c43c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts +++ /dev/null @@ -1,82 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; -import { mergeHeaders } from "./core/headers.js"; -import * as core from "./core/index.js"; - -export interface BaseClientOptions { - environment: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token?: core.Supplier; - /** Additional headers to include in requests. */ - headers?: Record | null | undefined>; - /** The default maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The default number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ - fetch?: typeof fetch; - /** Configure logging for the client. */ - logging?: core.logging.LogConfig | core.logging.Logger; -} - -export interface BaseRequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Additional query string parameters to include in the request. */ - queryParams?: Record; - /** Additional headers to include in the request. */ - headers?: Record | null | undefined>; -} - -export type NormalizedClientOptions = T & { - logging: core.logging.Logger; - authProvider?: core.AuthProvider; -}; - -export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { - authProvider: core.AuthProvider; -}; - -export function normalizeClientOptions(options: T): NormalizedClientOptions { - const headers = mergeHeaders( - { - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "@fern/exhaustive", - "X-Fern-SDK-Version": "0.0.1", - "User-Agent": "@fern/exhaustive/0.0.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - }, - options?.headers, - ); - - return { - ...options, - logging: core.logging.createLogger(options?.logging), - headers, - } as NormalizedClientOptions; -} - -export function normalizeClientOptionsWithAuth( - options: T, -): NormalizedClientOptionsWithAuth { - const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; - const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); - normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); - return normalized; -} - -function withNoOpAuthProvider( - options: NormalizedClientOptions, -): NormalizedClientOptionsWithAuth { - return { - ...options, - authProvider: new core.NoOpAuthProvider(), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts deleted file mode 100644 index d5ca904d9544..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; -import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; -import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; -import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; -import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; -import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; - -export declare namespace SeedExhaustiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class SeedExhaustiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _endpoints: EndpointsClient | undefined; - protected _inlinedRequests: InlinedRequestsClient | undefined; - protected _noAuth: NoAuthClient | undefined; - protected _noReqBody: NoReqBodyClient | undefined; - protected _reqWithHeaders: ReqWithHeadersClient | undefined; - - constructor(options: SeedExhaustiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get endpoints(): EndpointsClient { - return (this._endpoints ??= new EndpointsClient(this._options)); - } - - public get inlinedRequests(): InlinedRequestsClient { - return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); - } - - public get noAuth(): NoAuthClient { - return (this._noAuth ??= new NoAuthClient(this._options)); - } - - public get noReqBody(): NoReqBodyClient { - return (this._noReqBody ??= new NoReqBodyClient(this._options)); - } - - public get reqWithHeaders(): ReqWithHeadersClient { - return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts deleted file mode 100644 index b124def3d861..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts +++ /dev/null @@ -1,76 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { ContainerClient } from "../resources/container/client/Client.js"; -import { ContentTypeClient } from "../resources/contentType/client/Client.js"; -import { EnumClient } from "../resources/enum/client/Client.js"; -import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; -import { ObjectClient } from "../resources/object/client/Client.js"; -import { ParamsClient } from "../resources/params/client/Client.js"; -import { PrimitiveClient } from "../resources/primitive/client/Client.js"; -import { PutClient } from "../resources/put/client/Client.js"; -import { UnionClient } from "../resources/union/client/Client.js"; -import { UrlsClient } from "../resources/urls/client/Client.js"; - -export declare namespace EndpointsClient { - export interface Options extends BaseClientOptions {} -} - -export class EndpointsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _container: ContainerClient | undefined; - protected _contentType: ContentTypeClient | undefined; - protected _enum: EnumClient | undefined; - protected _httpMethods: HttpMethodsClient | undefined; - protected _object: ObjectClient | undefined; - protected _params: ParamsClient | undefined; - protected _primitive: PrimitiveClient | undefined; - protected _put: PutClient | undefined; - protected _union: UnionClient | undefined; - protected _urls: UrlsClient | undefined; - - constructor(options: EndpointsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get container(): ContainerClient { - return (this._container ??= new ContainerClient(this._options)); - } - - public get contentType(): ContentTypeClient { - return (this._contentType ??= new ContentTypeClient(this._options)); - } - - public get enum(): EnumClient { - return (this._enum ??= new EnumClient(this._options)); - } - - public get httpMethods(): HttpMethodsClient { - return (this._httpMethods ??= new HttpMethodsClient(this._options)); - } - - public get object(): ObjectClient { - return (this._object ??= new ObjectClient(this._options)); - } - - public get params(): ParamsClient { - return (this._params ??= new ParamsClient(this._options)); - } - - public get primitive(): PrimitiveClient { - return (this._primitive ??= new PrimitiveClient(this._options)); - } - - public get put(): PutClient { - return (this._put ??= new PutClient(this._options)); - } - - public get union(): UnionClient { - return (this._union ??= new UnionClient(this._options)); - } - - public get urls(): UrlsClient { - return (this._urls ??= new UrlsClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts deleted file mode 100644 index 9eb1192dcc32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts deleted file mode 100644 index dd50598a34d7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts +++ /dev/null @@ -1,458 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContainerClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContainerClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContainerClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) - */ - public getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string[], rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/list-of-primitives", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfObjects([{ - * string: "string" - * }, { - * string: "string" - * }]) - */ - public getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); - } - - private async __getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]) - */ - public getAndReturnSetOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnSetOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string[], rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfObjects([{ - * string: "string" - * }]) - */ - public getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); - } - - private async __getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapPrimToPrim({ - * "string": "string" - * }) - */ - public getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); - } - - private async __getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-prim", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as Record, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapOfPrimToObject({ - * "string": { - * string: "string" - * } - * }) - */ - public getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); - } - - private async __getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as Record, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/map-prim-to-object", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnOptional({ - * string: "string" - * }) - */ - public getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); - } - - private async __getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/opt-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request != null ? request : undefined, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField | undefined, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts deleted file mode 100644 index 0dcd19c50614..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts +++ /dev/null @@ -1,171 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContentTypeClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContentTypeClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContentTypeClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); - } - - private async __postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/bar", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__postJsonPatchContentWithCharsetType(request, requestOptions), - ); - } - - private async __postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/baz", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json; charset=utf-8", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts deleted file mode 100644 index f15447a67ae8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts +++ /dev/null @@ -1,80 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace EnumClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class EnumClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: EnumClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.WeatherReport} request - * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.enum.getAndReturnEnum("SUNNY") - */ - public getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); - } - - private async __getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/enum", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as SeedExhaustive.types.WeatherReport, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts deleted file mode 100644 index 9383ef15a189..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts +++ /dev/null @@ -1,334 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace HttpMethodsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class HttpMethodsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: HttpMethodsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testGet("id") - */ - public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); - } - - private async __testGet( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPost({ - * string: "string" - * }) - */ - public testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); - } - - private async __testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/http-methods", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPut("id", { - * string: "string" - * }) - */ - public testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); - } - - private async __testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPatch("id", { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); - } - - private async __testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PATCH", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testDelete("id") - */ - public testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); - } - - private async __testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "DELETE", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as boolean, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts deleted file mode 100644 index 6046843b5e42..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * as container from "./container/index.js"; -export * as contentType from "./contentType/index.js"; -export * as enum_ from "./enum/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * from "./params/client/requests/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * from "./put/client/requests/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as union from "./union/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts deleted file mode 100644 index 3a67887dbd74..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts +++ /dev/null @@ -1,522 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ObjectClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ObjectClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ObjectClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithOptionalField({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); - } - - private async __getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-optional-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithRequiredField({ - * string: "string" - * }) - */ - public getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); - } - - private async __getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-required-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-required-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithMapOfMap} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithMapOfMap({ - * map: { - * "map": { - * "map": "map" - * } - * } - * }) - */ - public getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); - } - - private async __getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-map-of-map", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithMapOfMap, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-map-of-map", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithOptionalField({ - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithOptionalField(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.NestedObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-optional-field", - ); - } - - /** - * @param {string} string - * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field/{string}", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }, { - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }]) - */ - public getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-required-field-list", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field-list", - ); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts deleted file mode 100644 index 890bfd8293e6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts +++ /dev/null @@ -1,522 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ParamsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ParamsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ParamsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * GET with path param - * - * @param {string} param - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPath("param") - */ - public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); - } - - private async __getWithPath( - param: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with path param - * - * @param {SeedExhaustive.endpoints.GetWithInlinePath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePath({ - * param: "param" - * }) - */ - public getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); - } - - private async __getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with query param - * - * @param {SeedExhaustive.endpoints.GetWithQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); - } - - private async __getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - _queryParams.number = number_.toString(); - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with multiple of same query param - * - * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithAllowMultipleQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); - } - - private async __getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - if (Array.isArray(query)) { - _queryParams.query = query.map((item) => item); - } else { - _queryParams.query = query; - } - - if (Array.isArray(number_)) { - _queryParams.number = number_.map((item) => item.toString()); - } else { - _queryParams.number = number_.toString(); - } - - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with path and query params - * - * @param {string} param - * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPathAndQuery("param", { - * query: "query" - * }) - */ - public getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); - } - - private async __getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * GET with path and query params - * - * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePathAndQuery({ - * param: "param", - * query: "query" - * }) - */ - public getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); - } - - private async __getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * PUT to update with path param - * - * @param {string} param - * @param {string} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithPath("param", "string") - */ - public modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); - } - - private async __modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } - - /** - * PUT to update with path param - * - * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithInlinePath({ - * param: "param", - * body: "string" - * }) - */ - public modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); - } - - private async __modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: _body, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts deleted file mode 100644 index 473165eb1638..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param" - * } - */ -export interface GetWithInlinePath { - param: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts deleted file mode 100644 index 9c674a852dce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * query: "query" - * } - */ -export interface GetWithInlinePathAndQuery { - param: string; - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts deleted file mode 100644 index baca4fafbe62..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithMultipleQuery { - query: string | string[]; - number: number | number[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts deleted file mode 100644 index c3f0018a7874..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query" - * } - */ -export interface GetWithPathAndQuery { - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts deleted file mode 100644 index 7ad48dee4508..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithQuery { - query: string; - number: number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts deleted file mode 100644 index f3f91a06e3f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * body: "string" - * } - */ -export interface ModifyResourceAtInlinedPath { - param: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts deleted file mode 100644 index b059d3702a32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { GetWithInlinePath } from "./GetWithInlinePath.js"; -export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; -export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; -export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; -export type { GetWithQuery } from "./GetWithQuery.js"; -export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts deleted file mode 100644 index 98244a13252b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts +++ /dev/null @@ -1,535 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; - -export declare namespace PrimitiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PrimitiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PrimitiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnString("string") - */ - public getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); - } - - private async __getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/string", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnInt(1) - */ - public getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); - } - - private async __getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/integer", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as number, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnLong(1000000) - */ - public getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); - } - - private async __getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/long", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as number, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDouble(1.1) - */ - public getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); - } - - private async __getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/double", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as number, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); - } - - /** - * @param {boolean} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBool(true) - */ - public getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); - } - - private async __getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/boolean", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as boolean, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z") - */ - public getAndReturnDatetime( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); - } - - private async __getAndReturnDatetime( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/datetime", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDate("2023-01-15") - */ - public getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); - } - - private async __getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/date", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") - */ - public getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); - } - - private async __getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/uuid", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") - */ - public getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); - } - - private async __getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/base64", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts deleted file mode 100644 index 5c4e4edf4e39..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts +++ /dev/null @@ -1,80 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace PutClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PutClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PutClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.endpoints.PutRequest} request - * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.put.add({ - * id: "id" - * }) - */ - public add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); - } - - private async __add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): Promise> { - const { id } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as SeedExhaustive.endpoints.PutResponse, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts deleted file mode 100644 index 2beba9f087cc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * id: "id" - * } - */ -export interface PutRequest { - id: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts deleted file mode 100644 index dba0eda4bbee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts deleted file mode 100644 index d9adb1af9a93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index a197fec87887..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCategory = { - ApiError: "API_ERROR", - AuthenticationError: "AUTHENTICATION_ERROR", - InvalidRequestError: "INVALID_REQUEST_ERROR", -} as const; -export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 3943226222d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCode = { - InternalServerError: "INTERNAL_SERVER_ERROR", - Unauthorized: "UNAUTHORIZED", - Forbidden: "FORBIDDEN", - BadRequest: "BAD_REQUEST", - Conflict: "CONFLICT", - Gone: "GONE", - UnprocessableEntity: "UNPROCESSABLE_ENTITY", - NotImplemented: "NOT_IMPLEMENTED", - BadGateway: "BAD_GATEWAY", - ServiceUnavailable: "SERVICE_UNAVAILABLE", - Unknown: "Unknown", -} as const; -export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 9cf9f495a09a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface Error_ { - category: SeedExhaustive.endpoints.ErrorCategory; - code: SeedExhaustive.endpoints.ErrorCode; - detail?: string; - field?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 628b46ba7298..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface PutResponse { - errors?: SeedExhaustive.endpoints.Error_[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts deleted file mode 100644 index fe75d063f585..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts +++ /dev/null @@ -1,84 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace UnionClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UnionClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UnionClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.Animal} request - * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.union.getAndReturnUnion({ - * animal: "dog", - * name: "name", - * likesToWoof: true - * }) - */ - public getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); - } - - private async __getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/union", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as SeedExhaustive.types.Animal, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts deleted file mode 100644 index 955bb036344f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts +++ /dev/null @@ -1,210 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; - -export declare namespace UrlsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UrlsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UrlsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withMixedCase() - */ - public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); - } - - private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/MixedCase", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.noEndingSlash() - */ - public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); - } - - private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/no-ending-slash", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withEndingSlash() - */ - public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); - } - - private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with-ending-slash/", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withUnderscores() - */ - public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); - } - - private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with_underscores", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts deleted file mode 100644 index 6c0020d2b75a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../core/index.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export class BadRequestBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { - super({ - message: "BadRequestBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts deleted file mode 100644 index 61778bda5417..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index 6ad426742488..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface BadObjectRequestInfo { - message: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts deleted file mode 100644 index 3ca611c9fb54..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * from "./generalErrors/errors/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * from "./reqWithHeaders/client/requests/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts deleted file mode 100644 index b2a084be5dbd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts +++ /dev/null @@ -1,110 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace InlinedRequestsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class InlinedRequestsClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: InlinedRequestsClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST with custom object in request body, response is an object - * - * @param {SeedExhaustive.PostWithObjectBody} request - * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.inlinedRequests.postWithObjectBodyandResponse({ - * string: "string", - * integer: 1, - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); - } - - private async __postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/req-bodies/object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - _response.error.body as SeedExhaustive.BadObjectRequestInfo, - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index b20679ee1c90..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../index.js"; - -/** - * @example - * { - * string: "string", - * integer: 1, - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * } - */ -export interface PostWithObjectBody { - string: string; - integer: number; - NestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index 104f84256770..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts deleted file mode 100644 index cefce5ee90bd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts +++ /dev/null @@ -1,89 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoAuthClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoAuthClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: NoAuthClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST request with no auth - * - * @param {unknown} request - * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.noAuth.postWithNoAuth({ - * "key": "value" - * }) - */ - public postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); - } - - private async __postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-auth", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as boolean, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - _response.error.body as SeedExhaustive.BadObjectRequestInfo, - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts deleted file mode 100644 index dbf262403321..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts +++ /dev/null @@ -1,126 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoReqBodyClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoReqBodyClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: NoReqBodyClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.getWithNoRequestBody() - */ - public getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); - } - - private async __getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.postWithNoRequestBody() - */ - public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); - } - - private async __postWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "POST", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts deleted file mode 100644 index 29b39fb91fdd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace ReqWithHeadersClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ReqWithHeadersClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ReqWithHeadersClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.ReqWithHeaders} request - * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.reqWithHeaders.getWithCustomHeader({ - * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - * body: "string" - * }) - */ - public getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); - } - - private async __getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): Promise> { - const { - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - body: _body, - } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - mergeOnlyDefinedHeaders({ - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - }), - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/test-headers/custom-header", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: _body, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts deleted file mode 100644 index 4b2e6816729b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - * body: "string" - * } - */ -export interface ReqWithHeaders { - "X-TEST-SERVICE-HEADER": string; - "X-TEST-ENDPOINT-HEADER": string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts deleted file mode 100644 index 5419b56cd667..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index ed458c66ba3c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,66 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithDocs { - /** - * Characters that could lead to broken generated SDKs: - * - * Markdown Escapes: - * - \_: Escaped underscore (e.g., FOO\_BAR) - * - \*: Escaped asterisk - * - * JSDoc (JavaScript/TypeScript): - * - @: Used for JSDoc tags - * - {: }: Used for type definitions - * - <: >: HTML tags - * - *: Can interfere with comment blocks - * - /**: JSDoc comment start - * - ** /: JSDoc comment end - * - &: HTML entities - * - * XMLDoc (C#): - * - <: >: XML tags - * - &: ': ": <: >: XML special characters - * - {: }: Used for interpolated strings - * - ///: Comment marker - * - /**: Block comment start - * - ** /: Block comment end - * - * Javadoc (Java): - * - @: Used for Javadoc tags - * - <: >: HTML tags - * - &: HTML entities - * - *: Can interfere with comment blocks - * - /**: Javadoc comment start - * - ** /: Javadoc comment end - * - * Doxygen (C++): - * - \: Used for Doxygen commands - * - @: Alternative command prefix - * - <: >: XML/HTML tags - * - &: HTML entities - * - /**: C-style comment start - * - ** /: C-style comment end - * - * RDoc (Ruby): - * - :: Used in symbol notation - * - =: Section markers - * - #: Comment marker - * - =begin: Block comment start - * - =end: Block comment end - * - @: Instance variable prefix - * - $: Global variable prefix - * - %: String literal delimiter - * - #{: String interpolation start - * - }: String interpolation end - * - * PHPDoc (PHP): - * - @: Used for PHPDoc tags - * - {: }: Used for type definitions - * - $: Variable prefix - * - /**: PHPDoc comment start - * - ** /: PHPDoc comment end - * - *: Can interfere with comment blocks - * - &: HTML entities - */ - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts deleted file mode 100644 index ef1aee2d386e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithEnumBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithEnumBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts deleted file mode 100644 index 203651bfb712..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index 4023a0068946..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const WeatherReport = { - Sunny: "SUNNY", - Cloudy: "CLOUDY", - Raining: "RAINING", - Snowing: "SNOWING", -} as const; -export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts deleted file mode 100644 index c2a44b58ecd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * from "./enum/errors/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * from "./object/errors/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * from "./union/errors/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts deleted file mode 100644 index 2681788e4f04..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts deleted file mode 100644 index 203710315112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts deleted file mode 100644 index 230964f8467f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts deleted file mode 100644 index b8a86dc99dd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts deleted file mode 100644 index e38a83090455..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./NestedObjectWithOptionalFieldError.js"; -export * from "./NestedObjectWithRequiredFieldError.js"; -export * from "./ObjectWithOptionalFieldError.js"; -export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index 4898ba728836..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface DoubleOptional { - optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index b7fddd5d2018..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithOptionalField { - string?: string; - NestedObject?: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index ae3312eae621..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithRequiredField { - string: string; - NestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index b35138a717bb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithMapOfMap { - map: Record>; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 47615d58f541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithOptionalField { - /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ - string?: string; - integer?: number; - long?: number; - double?: number; - bool?: boolean; - datetime?: string; - date?: string; - uuid?: string; - base64?: string; - list?: string[]; - set?: string[]; - map?: Record; - bigint?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index 032a84135c9e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithRequiredField { - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index 5dac5b761df8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts deleted file mode 100644 index c0e5b750495f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithUnionBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithUnionBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts deleted file mode 100644 index 940b191924ee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index f5336c6b33bc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; - -export namespace Animal { - export interface Dog extends SeedExhaustive.types.Dog { - animal: "dog"; - } - - export interface Cat extends SeedExhaustive.types.Cat { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index aa74d5b7dd01..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Cat { - name: string; - likesToMeow: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 24bc9aa321b1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Dog { - name: string; - likesToWoof: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts deleted file mode 100644 index b556b3f7bd94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../core/index.js"; -import * as errors from "../errors/index.js"; - -export namespace BearerAuthProvider { - export interface Options { - token?: core.Supplier; - } -} - -export class BearerAuthProvider implements core.AuthProvider { - private readonly token: core.Supplier; - - constructor(options: BearerAuthProvider.Options) { - this.token = options.token; - } - - public static canCreate(options: BearerAuthProvider.Options): boolean { - return options.token != null; - } - - public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { - const token = await core.Supplier.get(this.token); - if (token == null) { - throw new errors.SeedExhaustiveError({ - message: "Please specify a token by passing it in to the constructor", - }); - } - - return { - headers: { Authorization: `Bearer ${token}` }, - }; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts deleted file mode 100644 index 0ecb12b79bdb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts deleted file mode 100644 index 895a50ff30da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export interface AuthProvider { - getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts deleted file mode 100644 index f6218b42211e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Request parameters for authentication requests. - */ -export interface AuthRequest { - /** - * The headers to be included in the request. - */ - headers: Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts deleted file mode 100644 index a64235910062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { base64Decode, base64Encode } from "../base64.js"; - -export interface BasicAuth { - username: string; - password: string; -} - -const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; - -export const BasicAuth = { - toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { - if (basicAuth == null) { - return undefined; - } - const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); - return `Basic ${token}`; - }, - fromAuthorizationHeader: (header: string): BasicAuth => { - const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); - const decoded = base64Decode(credentials); - const [username, ...passwordParts] = decoded.split(":"); - const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; - - if (username == null || password == null) { - throw new Error("Invalid basic auth"); - } - return { - username, - password, - }; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts deleted file mode 100644 index c44a06c38f06..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type BearerToken = string; - -const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; - -function toAuthorizationHeader(token: string | undefined): string | undefined { - if (token == null) { - return undefined; - } - return `Bearer ${token}`; -} - -export const BearerToken: { - toAuthorizationHeader: typeof toAuthorizationHeader; - fromAuthorizationHeader: (header: string) => BearerToken; -} = { - toAuthorizationHeader: toAuthorizationHeader, - fromAuthorizationHeader: (header: string): BearerToken => { - return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts deleted file mode 100644 index 5b7acfd2bd8b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { AuthProvider } from "./AuthProvider.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export class NoOpAuthProvider implements AuthProvider { - public getAuthRequest(): Promise { - return Promise.resolve({ headers: {} }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts deleted file mode 100644 index 2215b227709e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { AuthProvider } from "./AuthProvider.js"; -export type { AuthRequest } from "./AuthRequest.js"; -export { BasicAuth } from "./BasicAuth.js"; -export { BearerToken } from "./BearerToken.js"; -export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts deleted file mode 100644 index 448a0db638a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts +++ /dev/null @@ -1,27 +0,0 @@ -function base64ToBytes(base64: string): Uint8Array { - const binString = atob(base64); - return Uint8Array.from(binString, (m) => m.codePointAt(0)!); -} - -function bytesToBase64(bytes: Uint8Array): string { - const binString = String.fromCodePoint(...bytes); - return btoa(binString); -} - -export function base64Encode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "utf8").toString("base64"); - } - - const bytes = new TextEncoder().encode(input); - return bytesToBase64(bytes); -} - -export function base64Decode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "base64").toString("utf8"); - } - - const bytes = base64ToBytes(input); - return new TextDecoder().decode(bytes); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts deleted file mode 100644 index 69296d7100d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts deleted file mode 100644 index 97ab83c2b195..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RawResponse } from "./RawResponse.js"; - -/** - * The response of an API call. - * It is a successful response or a failed response. - */ -export type APIResponse = SuccessfulResponse | FailedResponse; - -export interface SuccessfulResponse { - ok: true; - body: T; - /** - * @deprecated Use `rawResponse` instead - */ - headers?: Record; - rawResponse: RawResponse; -} - -export interface FailedResponse { - ok: false; - error: T; - rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts deleted file mode 100644 index bca7f4c77981..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type BinaryResponse = { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - bodyUsed: Response["bodyUsed"]; - /** - * Returns a ReadableStream of the response body. - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) - */ - stream: () => Response["body"]; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer: () => ReturnType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob: () => ReturnType; - /** - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) - * Some versions of the Fetch API may not support this method. - */ - bytes?(): ReturnType; -}; - -export function getBinaryResponse(response: Response): BinaryResponse { - const binaryResponse: BinaryResponse = { - get bodyUsed() { - return response.bodyUsed; - }, - stream: () => response.body, - arrayBuffer: response.arrayBuffer.bind(response), - blob: response.blob.bind(response), - }; - if ("bytes" in response && typeof response.bytes === "function") { - binaryResponse.bytes = response.bytes.bind(response); - } - - return binaryResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts deleted file mode 100644 index 998d68f5c20c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type SecuritySchemeKey = string; -/** - * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. - * All schemes in the collection must be satisfied for authentication to be successful. - */ -export type SecuritySchemeCollection = Record; -export type AuthScope = string; -export type EndpointMetadata = { - /** - * An array of security scheme collections. Each collection represents an alternative way to authenticate. - */ - security?: SecuritySchemeCollection[]; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts deleted file mode 100644 index 8079841c4062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import type { Supplier } from "./Supplier.js"; - -type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; -export type EndpointSupplier = Supplier | EndpointSupplierFn; -export const EndpointSupplier = { - get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { - if (typeof supplier === "function") { - return (supplier as EndpointSupplierFn)(arg); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts deleted file mode 100644 index 58bb0e3ef7d9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts +++ /dev/null @@ -1,391 +0,0 @@ -import { toJson } from "../json.js"; -import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; -import type { APIResponse } from "./APIResponse.js"; -import { createRequestUrl } from "./createRequestUrl.js"; -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import { EndpointSupplier } from "./EndpointSupplier.js"; -import { getErrorResponseBody } from "./getErrorResponseBody.js"; -import { getFetchFn } from "./getFetchFn.js"; -import { getRequestBody } from "./getRequestBody.js"; -import { getResponseBody } from "./getResponseBody.js"; -import { Headers } from "./Headers.js"; -import { makeRequest } from "./makeRequest.js"; -import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -import { requestWithRetries } from "./requestWithRetries.js"; - -export type FetchFunction = (args: Fetcher.Args) => Promise>; - -export declare namespace Fetcher { - export interface Args { - url: string; - method: string; - contentType?: string; - headers?: Record | null | undefined>; - queryParameters?: Record; - body?: unknown; - timeoutMs?: number; - maxRetries?: number; - withCredentials?: boolean; - abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes" | "form" | "other"; - responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; - duplex?: "half"; - endpointMetadata?: EndpointMetadata; - fetchFn?: typeof fetch; - logging?: LogConfig | Logger; - } - - export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; - - export interface FailedStatusCodeError { - reason: "status-code"; - statusCode: number; - body: unknown; - } - - export interface NonJsonError { - reason: "non-json"; - statusCode: number; - rawBody: string; - } - - export interface BodyIsNullError { - reason: "body-is-null"; - statusCode: number; - } - - export interface TimeoutError { - reason: "timeout"; - } - - export interface UnknownError { - reason: "unknown"; - errorMessage: string; - } -} - -const SENSITIVE_HEADERS = new Set([ - "authorization", - "www-authenticate", - "x-api-key", - "api-key", - "apikey", - "x-api-token", - "x-auth-token", - "auth-token", - "cookie", - "set-cookie", - "proxy-authorization", - "proxy-authenticate", - "x-csrf-token", - "x-xsrf-token", - "x-session-token", - "x-access-token", -]); - -function redactHeaders(headers: Headers | Record): Record { - const filtered: Record = {}; - for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { - if (SENSITIVE_HEADERS.has(key.toLowerCase())) { - filtered[key] = "[REDACTED]"; - } else { - filtered[key] = value; - } - } - return filtered; -} - -const SENSITIVE_QUERY_PARAMS = new Set([ - "api_key", - "api-key", - "apikey", - "token", - "access_token", - "access-token", - "auth_token", - "auth-token", - "password", - "passwd", - "secret", - "api_secret", - "api-secret", - "apisecret", - "key", - "session", - "session_id", - "session-id", -]); - -function redactQueryParameters(queryParameters?: Record): Record | undefined { - if (queryParameters == null) { - return queryParameters; - } - const redacted: Record = {}; - for (const [key, value] of Object.entries(queryParameters)) { - if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { - redacted[key] = "[REDACTED]"; - } else { - redacted[key] = value; - } - } - return redacted; -} - -function redactUrl(url: string): string { - const protocolIndex = url.indexOf("://"); - if (protocolIndex === -1) return url; - - const afterProtocol = protocolIndex + 3; - - // Find the first delimiter that marks the end of the authority section - const pathStart = url.indexOf("/", afterProtocol); - let queryStart = url.indexOf("?", afterProtocol); - let fragmentStart = url.indexOf("#", afterProtocol); - - const firstDelimiter = Math.min( - pathStart === -1 ? url.length : pathStart, - queryStart === -1 ? url.length : queryStart, - fragmentStart === -1 ? url.length : fragmentStart, - ); - - // Find the LAST @ before the delimiter (handles multiple @ in credentials) - let atIndex = -1; - for (let i = afterProtocol; i < firstDelimiter; i++) { - if (url[i] === "@") { - atIndex = i; - } - } - - if (atIndex !== -1) { - url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; - } - - // Recalculate queryStart since url might have changed - queryStart = url.indexOf("?"); - if (queryStart === -1) return url; - - fragmentStart = url.indexOf("#", queryStart); - const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; - const queryString = url.slice(queryStart + 1, queryEnd); - - if (queryString.length === 0) return url; - - // FAST PATH: Quick check if any sensitive keywords present - // Using indexOf is faster than regex for simple substring matching - const lower = queryString.toLowerCase(); - const hasSensitive = - lower.includes("token") || - lower.includes("key") || - lower.includes("password") || - lower.includes("passwd") || - lower.includes("secret") || - lower.includes("session") || - lower.includes("auth"); - - if (!hasSensitive) { - return url; - } - - // SLOW PATH: Parse and redact - const redactedParams: string[] = []; - const params = queryString.split("&"); - - for (const param of params) { - const equalIndex = param.indexOf("="); - if (equalIndex === -1) { - redactedParams.push(param); - continue; - } - - const key = param.slice(0, equalIndex); - let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); - - if (!shouldRedact && key.includes("%")) { - try { - const decodedKey = decodeURIComponent(key); - shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); - } catch {} - } - - redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); - } - - return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); -} - -async function getHeaders(args: Fetcher.Args): Promise { - const newHeaders: Headers = new Headers(); - - newHeaders.set( - "Accept", - args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", - ); - if (args.body !== undefined && args.contentType != null) { - newHeaders.set("Content-Type", args.contentType); - } - - if (args.headers == null) { - return newHeaders; - } - - for (const [key, value] of Object.entries(args.headers)) { - const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); - if (typeof result === "string") { - newHeaders.set(key, result); - continue; - } - if (result == null) { - continue; - } - newHeaders.set(key, `${result}`); - } - return newHeaders; -} - -export async function fetcherImpl(args: Fetcher.Args): Promise> { - const url = createRequestUrl(args.url, args.queryParameters); - const requestBody: BodyInit | undefined = await getRequestBody({ - body: args.body, - type: args.requestType ?? "other", - }); - const fetchFn = args.fetchFn ?? (await getFetchFn()); - const headers = await getHeaders(args); - const logger = createLogger(args.logging); - - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - headers: redactHeaders(headers), - queryParameters: redactQueryParameters(args.queryParameters), - hasBody: requestBody != null, - }; - logger.debug("Making HTTP request", metadata); - } - - try { - const response = await requestWithRetries( - async () => - makeRequest( - fetchFn, - url, - args.method, - headers, - requestBody, - args.timeoutMs, - args.abortSignal, - args.withCredentials, - args.duplex, - ), - args.maxRetries, - ); - - if (response.status >= 200 && response.status < 400) { - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(response.headers), - }; - logger.debug("HTTP request succeeded", metadata); - } - const body = await getResponseBody(response, args.responseType); - return { - ok: true, - body: body as R, - headers: response.headers, - rawResponse: toRawResponse(response), - }; - } else { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), - }; - logger.error("HTTP request failed with error status", metadata); - } - return { - ok: false, - error: { - reason: "status-code", - statusCode: response.status, - body: await getErrorResponseBody(response), - }, - rawResponse: toRawResponse(response), - }; - } - } catch (error) { - if (args.abortSignal?.aborted) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - }; - logger.error("HTTP request was aborted", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: "The user aborted a request", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error && error.name === "AbortError") { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - timeoutMs: args.timeoutMs, - }; - logger.error("HTTP request timed out", metadata); - } - return { - ok: false, - error: { - reason: "timeout", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - errorMessage: error.message, - }; - logger.error("HTTP request failed with error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: error.message, - }, - rawResponse: unknownRawResponse, - }; - } - - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - error: toJson(error), - }; - logger.error("HTTP request failed with unknown error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: toJson(error), - }, - rawResponse: unknownRawResponse, - }; - } -} - -export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts deleted file mode 100644 index af841aa24f55..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts +++ /dev/null @@ -1,93 +0,0 @@ -let Headers: typeof globalThis.Headers; - -if (typeof globalThis.Headers !== "undefined") { - Headers = globalThis.Headers; -} else { - Headers = class Headers implements Headers { - private headers: Map; - - constructor(init?: HeadersInit) { - this.headers = new Map(); - - if (init) { - if (init instanceof Headers) { - init.forEach((value, key) => this.append(key, value)); - } else if (Array.isArray(init)) { - for (const [key, value] of init) { - if (typeof key === "string" && typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Each header entry must be a [string, string] tuple"); - } - } - } else { - for (const [key, value] of Object.entries(init)) { - if (typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Header values must be strings"); - } - } - } - } - } - - append(name: string, value: string): void { - const key = name.toLowerCase(); - const existing = this.headers.get(key) || []; - this.headers.set(key, [...existing, value]); - } - - delete(name: string): void { - const key = name.toLowerCase(); - this.headers.delete(key); - } - - get(name: string): string | null { - const key = name.toLowerCase(); - const values = this.headers.get(key); - return values ? values.join(", ") : null; - } - - has(name: string): boolean { - const key = name.toLowerCase(); - return this.headers.has(key); - } - - set(name: string, value: string): void { - const key = name.toLowerCase(); - this.headers.set(key, [value]); - } - - forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { - const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; - this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); - } - - getSetCookie(): string[] { - return this.headers.get("set-cookie") || []; - } - - *entries(): HeadersIterator<[string, string]> { - for (const [key, values] of this.headers.entries()) { - yield [key, values.join(", ")]; - } - } - - *keys(): HeadersIterator { - yield* this.headers.keys(); - } - - *values(): HeadersIterator { - for (const values of this.headers.values()) { - yield values.join(", "); - } - } - - [Symbol.iterator](): HeadersIterator<[string, string]> { - return this.entries(); - } - }; -} - -export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts deleted file mode 100644 index 692ca7d795f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { WithRawResponse } from "./RawResponse.js"; - -/** - * A promise that returns the parsed response and lets you retrieve the raw response too. - */ -export class HttpResponsePromise extends Promise { - private innerPromise: Promise>; - private unwrappedPromise: Promise | undefined; - - private constructor(promise: Promise>) { - // Initialize with a no-op to avoid premature parsing - super((resolve) => { - resolve(undefined as unknown as T); - }); - this.innerPromise = promise; - } - - /** - * Creates an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @param args - Arguments to pass to the function. - * @returns An `HttpResponsePromise` instance. - */ - public static fromFunction Promise>, T>( - fn: F, - ...args: Parameters - ): HttpResponsePromise { - return new HttpResponsePromise(fn(...args)); - } - - /** - * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @returns A function that returns an `HttpResponsePromise` instance. - */ - public static interceptFunction< - F extends (...args: never[]) => Promise>, - T = Awaited>["data"], - >(fn: F): (...args: Parameters) => HttpResponsePromise { - return (...args: Parameters): HttpResponsePromise => { - return HttpResponsePromise.fromPromise(fn(...args)); - }; - } - - /** - * Creates an `HttpResponsePromise` from an existing promise. - * - * @param promise - A promise resolving to a `WithRawResponse` object. - * @returns An `HttpResponsePromise` instance. - */ - public static fromPromise(promise: Promise>): HttpResponsePromise { - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from an executor function. - * - * @param executor - A function that takes resolve and reject callbacks to create a promise. - * @returns An `HttpResponsePromise` instance. - */ - public static fromExecutor( - executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, - ): HttpResponsePromise { - const promise = new Promise>(executor); - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from a resolved result. - * - * @param result - A `WithRawResponse` object to resolve immediately. - * @returns An `HttpResponsePromise` instance. - */ - public static fromResult(result: WithRawResponse): HttpResponsePromise { - const promise = Promise.resolve(result); - return new HttpResponsePromise(promise); - } - - private unwrap(): Promise { - if (!this.unwrappedPromise) { - this.unwrappedPromise = this.innerPromise.then(({ data }) => data); - } - return this.unwrappedPromise; - } - - /** @inheritdoc */ - public override then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, - ): Promise { - return this.unwrap().then(onfulfilled, onrejected); - } - - /** @inheritdoc */ - public override catch( - onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, - ): Promise { - return this.unwrap().catch(onrejected); - } - - /** @inheritdoc */ - public override finally(onfinally?: (() => void) | null): Promise { - return this.unwrap().finally(onfinally); - } - - /** - * Retrieves the data and raw response. - * - * @returns A promise resolving to a `WithRawResponse` object. - */ - public async withRawResponse(): Promise> { - return await this.innerPromise; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts deleted file mode 100644 index 37fb44e2aa99..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Headers } from "./Headers.js"; - -/** - * The raw response from the fetch call excluding the body. - */ -export type RawResponse = Omit< - { - [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions - }, - "ok" | "body" | "bodyUsed" ->; // strips out body and bodyUsed - -/** - * A raw response indicating that the request was aborted. - */ -export const abortRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 499, - statusText: "Client Closed Request", - type: "error", - url: "", -} as const; - -/** - * A raw response indicating an unknown error. - */ -export const unknownRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 0, - statusText: "Unknown Error", - type: "error", - url: "", -} as const; - -/** - * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, - * excluding the `body` and `bodyUsed` fields. - * - * @param response - The `RawResponse` object to convert. - * @returns A `RawResponse` object containing the extracted properties of the input response. - */ -export function toRawResponse(response: Response): RawResponse { - return { - headers: response.headers, - redirected: response.redirected, - status: response.status, - statusText: response.statusText, - type: response.type, - url: response.url, - }; -} - -/** - * Creates a `RawResponse` from a standard `Response` object. - */ -export interface WithRawResponse { - readonly data: T; - readonly rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts deleted file mode 100644 index 867c931c02f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type Supplier = T | Promise | (() => T | Promise); - -export const Supplier = { - get: async (supplier: Supplier): Promise => { - if (typeof supplier === "function") { - return (supplier as () => T)(); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts deleted file mode 100644 index 88e13265e112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { toQueryString } from "../url/qs.js"; - -export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { - const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); - return queryString ? `${baseUrl}?${queryString}` : baseUrl; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts deleted file mode 100644 index 7cf4e623c2f5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { fromJson } from "../json.js"; -import { getResponseBody } from "./getResponseBody.js"; - -export async function getErrorResponseBody(response: Response): Promise { - let contentType = response.headers.get("Content-Type")?.toLowerCase(); - if (contentType == null || contentType.length === 0) { - return getResponseBody(response); - } - - if (contentType.indexOf(";") !== -1) { - contentType = contentType.split(";")[0]?.trim() ?? ""; - } - switch (contentType) { - case "application/hal+json": - case "application/json": - case "application/ld+json": - case "application/problem+json": - case "application/vnd.api+json": - case "text/json": { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - default: - if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - - // Fallback to plain text if content type is not recognized - // Even if no body is present, the response will be an empty string - return await response.text(); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts deleted file mode 100644 index 9f845b956392..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function getFetchFn(): Promise { - return fetch; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts deleted file mode 100644 index 50f922b0e87f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function getHeader(headers: Record, header: string): string | undefined { - for (const [headerKey, headerValue] of Object.entries(headers)) { - if (headerKey.toLowerCase() === header.toLowerCase()) { - return headerValue; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts deleted file mode 100644 index 91d9d81f50e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toJson } from "../json.js"; -import { toQueryString } from "../url/qs.js"; - -export declare namespace GetRequestBody { - interface Args { - body: unknown; - type: "json" | "file" | "bytes" | "form" | "other"; - } -} - -export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { - if (type === "form") { - return toQueryString(body, { arrayFormat: "repeat", encode: true }); - } - if (type.includes("json")) { - return toJson(body); - } else { - return body as BodyInit; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts deleted file mode 100644 index 708d55728f2b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { fromJson } from "../json.js"; -import { getBinaryResponse } from "./BinaryResponse.js"; - -export async function getResponseBody(response: Response, responseType?: string): Promise { - switch (responseType) { - case "binary-response": - return getBinaryResponse(response); - case "blob": - return await response.blob(); - case "arrayBuffer": - return await response.arrayBuffer(); - case "sse": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - return response.body; - case "streaming": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - - return response.body; - - case "text": - return await response.text(); - } - - // if responseType is "json" or not specified, try to parse as JSON - const text = await response.text(); - if (text.length > 0) { - try { - const responseBody = fromJson(text); - return responseBody; - } catch (_err) { - return { - ok: false, - error: { - reason: "non-json", - statusCode: response.status, - rawBody: text, - }, - }; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts deleted file mode 100644 index c3bc6da20f49..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type { APIResponse } from "./APIResponse.js"; -export type { BinaryResponse } from "./BinaryResponse.js"; -export type { EndpointMetadata } from "./EndpointMetadata.js"; -export { EndpointSupplier } from "./EndpointSupplier.js"; -export type { Fetcher, FetchFunction } from "./Fetcher.js"; -export { fetcher } from "./Fetcher.js"; -export { getHeader } from "./getHeader.js"; -export { HttpResponsePromise } from "./HttpResponsePromise.js"; -export type { RawResponse, WithRawResponse } from "./RawResponse.js"; -export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts deleted file mode 100644 index 921565eb0063..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { anySignal, getTimeoutSignal } from "./signals.js"; - -export const makeRequest = async ( - fetchFn: (url: string, init: RequestInit) => Promise, - url: string, - method: string, - headers: Headers | Record, - requestBody: BodyInit | undefined, - timeoutMs?: number, - abortSignal?: AbortSignal, - withCredentials?: boolean, - duplex?: "half", -): Promise => { - const signals: AbortSignal[] = []; - - let timeoutAbortId: ReturnType | undefined; - if (timeoutMs != null) { - const { signal, abortId } = getTimeoutSignal(timeoutMs); - timeoutAbortId = abortId; - signals.push(signal); - } - - if (abortSignal != null) { - signals.push(abortSignal); - } - const newSignals = anySignal(signals); - const response = await fetchFn(url, { - method: method, - headers, - body: requestBody, - signal: newSignals, - credentials: withCredentials ? "include" : undefined, - // @ts-ignore - duplex, - }); - - if (timeoutAbortId != null) { - clearTimeout(timeoutAbortId); - } - - return response; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts deleted file mode 100644 index 1f689688c4b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts +++ /dev/null @@ -1,64 +0,0 @@ -const INITIAL_RETRY_DELAY = 1000; // in milliseconds -const MAX_RETRY_DELAY = 60000; // in milliseconds -const DEFAULT_MAX_RETRIES = 2; -const JITTER_FACTOR = 0.2; // 20% random jitter - -function addPositiveJitter(delay: number): number { - const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function addSymmetricJitter(delay: number): number { - const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { - const retryAfter = response.headers.get("Retry-After"); - if (retryAfter) { - const retryAfterSeconds = parseInt(retryAfter, 10); - if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { - return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); - } - - const retryAfterDate = new Date(retryAfter); - if (!Number.isNaN(retryAfterDate.getTime())) { - const delay = retryAfterDate.getTime() - Date.now(); - if (delay > 0) { - return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); - } - } - } - - const rateLimitReset = response.headers.get("X-RateLimit-Reset"); - if (rateLimitReset) { - const resetTime = parseInt(rateLimitReset, 10); - if (!Number.isNaN(resetTime)) { - const delay = resetTime * 1000 - Date.now(); - if (delay > 0) { - return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); - } - } - } - - return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); -} - -export async function requestWithRetries( - requestFn: () => Promise, - maxRetries: number = DEFAULT_MAX_RETRIES, -): Promise { - let response: Response = await requestFn(); - - for (let i = 0; i < maxRetries; ++i) { - if ([408, 429].includes(response.status) || response.status >= 500) { - const delay = getRetryDelayFromHeaders(response, i); - - await new Promise((resolve) => setTimeout(resolve, delay)); - response = await requestFn(); - } else { - break; - } - } - return response!; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts deleted file mode 100644 index 7bd3757ec3a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts +++ /dev/null @@ -1,26 +0,0 @@ -const TIMEOUT = "timeout"; - -export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { - const controller = new AbortController(); - const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); - return { signal: controller.signal, abortId }; -} - -export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { - const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; - - const controller = new AbortController(); - - for (const signal of signals) { - if (signal.aborted) { - controller.abort((signal as any)?.reason); - break; - } - - signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { - signal: controller.signal, - }); - } - - return controller.signal; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts deleted file mode 100644 index 78ed8b500c95..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts +++ /dev/null @@ -1,35 +0,0 @@ -export function mergeHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } else if (insensitiveKey in result) { - delete result[insensitiveKey]; - } - } - - return result; -} - -export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } - } - - return result; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts deleted file mode 100644 index 92290bfadcac..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from "./auth/index.js"; -export * from "./base64.js"; -export * from "./fetcher/index.js"; -export * as logging from "./logging/index.js"; -export * from "./runtime/index.js"; -export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts deleted file mode 100644 index c052f3249f4f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Serialize a value to JSON - * @param value A JavaScript value, usually an object or array, to be converted. - * @param replacer A function that transforms the results. - * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. - * @returns JSON string - */ -export const toJson = ( - value: unknown, - replacer?: (this: unknown, key: string, value: unknown) => unknown, - space?: string | number, -): string => { - return JSON.stringify(value, replacer, space); -}; - -/** - * Parse JSON string to object, array, or other type - * @param text A valid JSON string. - * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. - * @returns Parsed object, array, or other type - */ -export function fromJson( - text: string, - reviver?: (this: unknown, key: string, value: unknown) => unknown, -): T { - return JSON.parse(text, reviver); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts deleted file mode 100644 index 88f6c00db0cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as logger from "./logger.js"; - -export namespace logging { - /** - * Configuration for logger instances. - */ - export type LogConfig = logger.LogConfig; - export type LogLevel = logger.LogLevel; - export const LogLevel: typeof logger.LogLevel = logger.LogLevel; - export type ILogger = logger.ILogger; - /** - * Console logger implementation that outputs to the console. - */ - export type ConsoleLogger = logger.ConsoleLogger; - /** - * Console logger implementation that outputs to the console. - */ - export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts deleted file mode 100644 index d81cc32c40f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts deleted file mode 100644 index a3f3673cda93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts +++ /dev/null @@ -1,203 +0,0 @@ -export const LogLevel = { - Debug: "debug", - Info: "info", - Warn: "warn", - Error: "error", -} as const; -export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; -const logLevelMap: Record = { - [LogLevel.Debug]: 1, - [LogLevel.Info]: 2, - [LogLevel.Warn]: 3, - [LogLevel.Error]: 4, -}; - -export interface ILogger { - /** - * Logs a debug message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - debug(message: string, ...args: unknown[]): void; - /** - * Logs an info message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - info(message: string, ...args: unknown[]): void; - /** - * Logs a warning message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - warn(message: string, ...args: unknown[]): void; - /** - * Logs an error message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - error(message: string, ...args: unknown[]): void; -} - -/** - * Configuration for logger initialization. - */ -export interface LogConfig { - /** - * Minimum log level to output. - * @default LogLevel.Info - */ - level?: LogLevel; - /** - * Logger implementation to use. - * @default new ConsoleLogger() - */ - logger?: ILogger; - /** - * Whether logging should be silenced. - * @default true - */ - silent?: boolean; -} - -/** - * Default console-based logger implementation. - */ -export class ConsoleLogger implements ILogger { - debug(message: string, ...args: unknown[]): void { - console.debug(message, ...args); - } - info(message: string, ...args: unknown[]): void { - console.info(message, ...args); - } - warn(message: string, ...args: unknown[]): void { - console.warn(message, ...args); - } - error(message: string, ...args: unknown[]): void { - console.error(message, ...args); - } -} - -/** - * Logger class that provides level-based logging functionality. - */ -export class Logger { - private readonly level: number; - private readonly logger: ILogger; - private readonly silent: boolean; - - /** - * Creates a new logger instance. - * @param config - Logger configuration - */ - constructor(config: Required) { - this.level = logLevelMap[config.level]; - this.logger = config.logger; - this.silent = config.silent; - } - - /** - * Checks if a log level should be output based on configuration. - * @param level - The log level to check - * @returns True if the level should be logged - */ - public shouldLog(level: LogLevel): boolean { - return !this.silent && this.level <= logLevelMap[level]; - } - - /** - * Checks if debug logging is enabled. - * @returns True if debug logs should be output - */ - public isDebug(): boolean { - return this.shouldLog(LogLevel.Debug); - } - - /** - * Logs a debug message if debug logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public debug(message: string, ...args: unknown[]): void { - if (this.isDebug()) { - this.logger.debug(message, ...args); - } - } - - /** - * Checks if info logging is enabled. - * @returns True if info logs should be output - */ - public isInfo(): boolean { - return this.shouldLog(LogLevel.Info); - } - - /** - * Logs an info message if info logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public info(message: string, ...args: unknown[]): void { - if (this.isInfo()) { - this.logger.info(message, ...args); - } - } - - /** - * Checks if warning logging is enabled. - * @returns True if warning logs should be output - */ - public isWarn(): boolean { - return this.shouldLog(LogLevel.Warn); - } - - /** - * Logs a warning message if warning logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public warn(message: string, ...args: unknown[]): void { - if (this.isWarn()) { - this.logger.warn(message, ...args); - } - } - - /** - * Checks if error logging is enabled. - * @returns True if error logs should be output - */ - public isError(): boolean { - return this.shouldLog(LogLevel.Error); - } - - /** - * Logs an error message if error logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public error(message: string, ...args: unknown[]): void { - if (this.isError()) { - this.logger.error(message, ...args); - } - } -} - -export function createLogger(config?: LogConfig | Logger): Logger { - if (config == null) { - return defaultLogger; - } - if (config instanceof Logger) { - return config; - } - config = config ?? {}; - config.level ??= LogLevel.Info; - config.logger ??= new ConsoleLogger(); - config.silent ??= true; - return new Logger(config as Required); -} - -const defaultLogger: Logger = new Logger({ - level: LogLevel.Info, - logger: new ConsoleLogger(), - silent: true, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts deleted file mode 100644 index cfab23f9a834..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts deleted file mode 100644 index 56ebbb87c4d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts +++ /dev/null @@ -1,134 +0,0 @@ -interface DenoGlobal { - version: { - deno: string; - }; -} - -interface BunGlobal { - version: string; -} - -declare const Deno: DenoGlobal | undefined; -declare const Bun: BunGlobal | undefined; -declare const EdgeRuntime: string | undefined; -declare const self: typeof globalThis.self & { - importScripts?: unknown; -}; - -/** - * A constant that indicates which environment and version the SDK is running in. - */ -export const RUNTIME: Runtime = evaluateRuntime(); - -export interface Runtime { - type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; - version?: string; - parsedVersion?: number; -} - -function evaluateRuntime(): Runtime { - /** - * A constant that indicates whether the environment the code is running is a Web Browser. - */ - const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - if (isBrowser) { - return { - type: "browser", - version: window.navigator.userAgent, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Cloudflare. - * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent - */ - const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; - if (isCloudflare) { - return { - type: "workerd", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Edge Runtime. - * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime - */ - const isEdgeRuntime = typeof EdgeRuntime === "string"; - if (isEdgeRuntime) { - return { - type: "edge-runtime", - }; - } - - /** - * A constant that indicates whether the environment the code is running is a Web Worker. - */ - const isWebWorker = - typeof self === "object" && - typeof self?.importScripts === "function" && - (self.constructor?.name === "DedicatedWorkerGlobalScope" || - self.constructor?.name === "ServiceWorkerGlobalScope" || - self.constructor?.name === "SharedWorkerGlobalScope"); - if (isWebWorker) { - return { - type: "web-worker", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Deno. - * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions - */ - const isDeno = - typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - if (isDeno) { - return { - type: "deno", - version: Deno.version.deno, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Bun.sh. - */ - const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; - if (isBun) { - return { - type: "bun", - version: Bun.version, - }; - } - - /** - * A constant that indicates whether the environment the code is running is in React-Native. - * This check should come before Node.js detection since React Native may have a process polyfill. - * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js - */ - const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; - if (isReactNative) { - return { - type: "react-native", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ - const isNode = - typeof process !== "undefined" && - "version" in process && - !!process.version && - "versions" in process && - !!process.versions?.node; - if (isNode) { - return { - type: "node", - version: process.versions.node, - parsedVersion: Number(process.versions.node.split(".")[0]), - }; - } - - return { - type: "unknown", - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts deleted file mode 100644 index 19b901244218..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function encodePathParam(param: unknown): string { - if (param === null) { - return "null"; - } - const typeofParam = typeof param; - switch (typeofParam) { - case "undefined": - return "undefined"; - case "string": - case "number": - case "boolean": - break; - default: - param = String(param); - break; - } - return encodeURIComponent(param as string | number | boolean); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts deleted file mode 100644 index f2e0fa2d2221..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { encodePathParam } from "./encodePathParam.js"; -export { join } from "./join.js"; -export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts deleted file mode 100644 index 7ca7daef094d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts +++ /dev/null @@ -1,79 +0,0 @@ -export function join(base: string, ...segments: string[]): string { - if (!base) { - return ""; - } - - if (segments.length === 0) { - return base; - } - - if (base.includes("://")) { - let url: URL; - try { - url = new URL(base); - } catch { - return joinPath(base, ...segments); - } - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - url.pathname = joinPathSegments(url.pathname, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { - url.pathname += "/"; - } - - return url.toString(); - } - - return joinPath(base, ...segments); -} - -function joinPath(base: string, ...segments: string[]): string { - if (segments.length === 0) { - return base; - } - - let result = base; - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - result = joinPathSegments(result, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !result.endsWith("/")) { - result += "/"; - } - - return result; -} - -function joinPathSegments(left: string, right: string): string { - if (left.endsWith("/")) { - return left + right; - } - return `${left}/${right}`; -} - -function trimSlashes(str: string): string { - if (!str) return str; - - let start = 0; - let end = str.length; - - if (str.startsWith("/")) start = 1; - if (str.endsWith("/")) end = str.length - 1; - - return start === 0 && end === str.length ? str : str.slice(start, end); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts deleted file mode 100644 index 13e89be9d9a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts +++ /dev/null @@ -1,74 +0,0 @@ -interface QueryStringOptions { - arrayFormat?: "indices" | "repeat"; - encode?: boolean; -} - -const defaultQsOptions: Required = { - arrayFormat: "indices", - encode: true, -} as const; - -function encodeValue(value: unknown, shouldEncode: boolean): string { - if (value === undefined) { - return ""; - } - if (value === null) { - return ""; - } - const stringValue = String(value); - return shouldEncode ? encodeURIComponent(stringValue) : stringValue; -} - -function stringifyObject(obj: Record, prefix = "", options: Required): string[] { - const parts: string[] = []; - - for (const [key, value] of Object.entries(obj)) { - const fullKey = prefix ? `${prefix}[${key}]` : key; - - if (value === undefined) { - continue; - } - - if (Array.isArray(value)) { - if (value.length === 0) { - continue; - } - for (let i = 0; i < value.length; i++) { - const item = value[i]; - if (item === undefined) { - continue; - } - if (typeof item === "object" && !Array.isArray(item) && item !== null) { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - parts.push(...stringifyObject(item as Record, arrayKey, options)); - } else { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; - parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); - } - } - } else if (typeof value === "object" && value !== null) { - if (Object.keys(value as Record).length === 0) { - continue; - } - parts.push(...stringifyObject(value as Record, fullKey, options)); - } else { - const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; - parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); - } - } - - return parts; -} - -export function toQueryString(obj: unknown, options?: QueryStringOptions): string { - if (obj == null || typeof obj !== "object") { - return ""; - } - - const parts = stringifyObject(obj as Record, "", { - ...defaultQsOptions, - ...options, - }); - return parts.join("&"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts deleted file mode 100644 index d2e515f5d4e2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import { toJson } from "../core/json.js"; - -export class SeedExhaustiveError extends Error { - public readonly statusCode?: number; - public readonly body?: unknown; - public readonly rawResponse?: core.RawResponse; - - constructor({ - message, - statusCode, - body, - rawResponse, - }: { - message?: string; - statusCode?: number; - body?: unknown; - rawResponse?: core.RawResponse; - }) { - super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - this.statusCode = statusCode; - this.body = body; - this.rawResponse = rawResponse; - } -} - -function buildMessage({ - message, - statusCode, - body, -}: { - message: string | undefined; - statusCode: number | undefined; - body: unknown | undefined; -}): string { - const lines: string[] = []; - if (message != null) { - lines.push(message); - } - - if (statusCode != null) { - lines.push(`Status code: ${statusCode.toString()}`); - } - - if (body != null) { - lines.push(`Body: ${toJson(body, undefined, 2)}`); - } - - return lines.join("\n"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts deleted file mode 100644 index 82a3cb8de266..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export class SeedExhaustiveTimeoutError extends Error { - constructor(message: string) { - super(message); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts deleted file mode 100644 index deb55c602654..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import * as errors from "./index.js"; - -export function handleNonStatusCodeError( - error: core.Fetcher.Error, - rawResponse: core.RawResponse, - method: string, - path: string, -): never { - switch (error.reason) { - case "non-json": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - body: error.rawBody, - rawResponse: rawResponse, - }); - case "body-is-null": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - rawResponse: rawResponse, - }); - case "timeout": - throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); - case "unknown": - throw new errors.SeedExhaustiveError({ - message: error.errorMessage, - rawResponse: rawResponse, - }); - default: - throw new errors.SeedExhaustiveError({ - message: "Unknown error", - rawResponse: rawResponse, - }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts deleted file mode 100644 index 2e2853073a94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; -export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts deleted file mode 100644 index 7b70ee14fc02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts deleted file mode 100644 index 9ebdde6391a5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * as SeedExhaustive from "./api/index.js"; -export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -export { SeedExhaustiveClient } from "./Client.js"; -export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; -export * from "./exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts deleted file mode 100644 index b643a3e3ea27..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts +++ /dev/null @@ -1 +0,0 @@ -export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts deleted file mode 100644 index 7f5e031c8396..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This is a custom test file, if you wish to add more tests - * to your SDK. - * Be sure to mark this file in `.fernignore`. - * - * If you include example requests/responses in your fern definition, - * you will have tests automatically generated for you. - */ -describe("test", () => { - it("default", () => { - expect(true).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts deleted file mode 100644 index 954872157d52..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { RequestHandlerOptions } from "msw"; -import type { SetupServer } from "msw/node"; - -import { mockEndpointBuilder } from "./mockEndpointBuilder"; - -export interface MockServerOptions { - baseUrl: string; - server: SetupServer; -} - -export class MockServer { - private readonly server: SetupServer; - public readonly baseUrl: string; - - constructor({ baseUrl, server }: MockServerOptions) { - this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; - this.server = server; - } - - public mockEndpoint(options?: RequestHandlerOptions): ReturnType { - const builder = mockEndpointBuilder({ - once: options?.once ?? true, - onBuild: (handler) => { - this.server.use(handler); - }, - }).baseUrl(this.baseUrl); - return builder; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts deleted file mode 100644 index e1a90f7fb2e3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { setupServer } from "msw/node"; - -import { fromJson, toJson } from "../../src/core/json"; -import { MockServer } from "./MockServer"; -import { randomBaseUrl } from "./randomBaseUrl"; - -const mswServer = setupServer(); -interface MockServerOptions { - baseUrl?: string; -} - -async function formatHttpRequest(request: Request, id?: string): Promise { - try { - const clone = request.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Request ${id} ###\n` : ""; - const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting request: ${e}`; - } -} - -async function formatHttpResponse(response: Response, id?: string): Promise { - try { - const clone = response.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Response for ${id} ###\n` : ""; - const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting response: ${e}`; - } -} - -class MockServerPool { - private servers: MockServer[] = []; - - public createServer(options?: Partial): MockServer { - const baseUrl = options?.baseUrl || randomBaseUrl(); - const server = new MockServer({ baseUrl, server: mswServer }); - this.servers.push(server); - return server; - } - - public getServers(): MockServer[] { - return [...this.servers]; - } - - public listen(): void { - const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; - mswServer.listen({ onUnhandledRequest }); - - if (process.env.LOG_LEVEL === "debug") { - mswServer.events.on("request:start", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:start\n${formattedRequest}`); - }); - - mswServer.events.on("request:unhandled", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:unhandled\n${formattedRequest}`); - }); - - mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { - const formattedResponse = await formatHttpResponse(response, requestId); - console.debug(`response:mocked\n${formattedResponse}`); - }); - } - } - - public close(): void { - this.servers = []; - mswServer.close(); - } -} - -export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts deleted file mode 100644 index 1b0e51079e6b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; - -import { url } from "../../src/core"; -import { toJson } from "../../src/core/json"; -import { withFormUrlEncoded } from "./withFormUrlEncoded"; -import { withHeaders } from "./withHeaders"; -import { withJson } from "./withJson"; - -type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; - -interface MethodStage { - baseUrl(baseUrl: string): MethodStage; - all(path: string): RequestHeadersStage; - get(path: string): RequestHeadersStage; - post(path: string): RequestHeadersStage; - put(path: string): RequestHeadersStage; - delete(path: string): RequestHeadersStage; - patch(path: string): RequestHeadersStage; - options(path: string): RequestHeadersStage; - head(path: string): RequestHeadersStage; -} - -interface RequestHeadersStage extends RequestBodyStage, ResponseStage { - header(name: string, value: string): RequestHeadersStage; - headers(headers: Record): RequestBodyStage; -} - -interface RequestBodyStage extends ResponseStage { - jsonBody(body: unknown): ResponseStage; - formUrlEncodedBody(body: unknown): ResponseStage; -} - -interface ResponseStage { - respondWith(): ResponseStatusStage; -} -interface ResponseStatusStage { - statusCode(statusCode: number): ResponseHeaderStage; -} - -interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { - header(name: string, value: string): ResponseHeaderStage; - headers(headers: Record): ResponseHeaderStage; -} - -interface ResponseBodyStage { - jsonBody(body: unknown): BuildStage; -} - -interface BuildStage { - build(): HttpHandler; -} - -export interface HttpHandlerBuilderOptions { - onBuild?: (handler: HttpHandler) => void; - once?: boolean; -} - -class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { - private method: HttpMethod = "get"; - private _baseUrl: string = ""; - private path: string = "/"; - private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - constructor(options?: HttpHandlerBuilderOptions) { - this.handlerOptions = options; - } - - baseUrl(baseUrl: string): MethodStage { - this._baseUrl = baseUrl; - return this; - } - - all(path: string): RequestHeadersStage { - this.method = "all"; - this.path = path; - return this; - } - - get(path: string): RequestHeadersStage { - this.method = "get"; - this.path = path; - return this; - } - - post(path: string): RequestHeadersStage { - this.method = "post"; - this.path = path; - return this; - } - - put(path: string): RequestHeadersStage { - this.method = "put"; - this.path = path; - return this; - } - - delete(path: string): RequestHeadersStage { - this.method = "delete"; - this.path = path; - return this; - } - - patch(path: string): RequestHeadersStage { - this.method = "patch"; - this.path = path; - return this; - } - - options(path: string): RequestHeadersStage { - this.method = "options"; - this.path = path; - return this; - } - - head(path: string): RequestHeadersStage { - this.method = "head"; - this.path = path; - return this; - } - - header(name: string, value: string): RequestHeadersStage { - this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); - return this; - } - - headers(headers: Record): RequestBodyStage { - this.predicates.push((resolver) => withHeaders(headers, resolver)); - return this; - } - - jsonBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); - } - this.predicates.push((resolver) => withJson(body, resolver)); - return this; - } - - formUrlEncodedBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error( - "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", - ); - } - this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); - return this; - } - - respondWith(): ResponseStatusStage { - return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); - } - - private buildUrl(): string { - return url.join(this._baseUrl, this.path); - } -} - -class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { - private readonly method: HttpMethod; - private readonly url: string; - private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - private responseStatusCode: number = 200; - private responseHeaders: Record = {}; - private responseBody: DefaultBodyType = undefined; - - constructor( - method: HttpMethod, - url: string, - requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], - options?: HttpHandlerBuilderOptions, - ) { - this.method = method; - this.url = url; - this.requestPredicates = requestPredicates; - this.handlerOptions = options; - } - - public statusCode(code: number): ResponseHeaderStage { - this.responseStatusCode = code; - return this; - } - - public header(name: string, value: string): ResponseHeaderStage { - this.responseHeaders[name] = value; - return this; - } - - public headers(headers: Record): ResponseHeaderStage { - this.responseHeaders = { ...this.responseHeaders, ...headers }; - return this; - } - - public jsonBody(body: unknown): BuildStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); - } - this.responseBody = toJson(body); - return this; - } - - public build(): HttpHandler { - const responseResolver: HttpResponseResolver = () => { - const response = new HttpResponse(this.responseBody, { - status: this.responseStatusCode, - headers: this.responseHeaders, - }); - // if no Content-Type header is set, delete the default text content type that is set - if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { - response.headers.delete("Content-Type"); - } - return response; - }; - - const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); - - const handler = http[this.method](this.url, finalResolver, this.handlerOptions); - this.handlerOptions?.onBuild?.(handler); - return handler; - } -} - -export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { - return new RequestBuilder(options); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts deleted file mode 100644 index 031aa6408aca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function randomBaseUrl(): string { - const randomString = Math.random().toString(36).substring(2, 15); - return `http://${randomString}.localhost`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts deleted file mode 100644 index aeb3a95af7dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { afterAll, beforeAll } from "vitest"; - -import { mockServerPool } from "./MockServerPool"; - -beforeAll(() => { - mockServerPool.listen(); -}); -afterAll(() => { - mockServerPool.close(); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts deleted file mode 100644 index e9e6ff2d9cf1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: Record; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a form-urlencoded body."); - return passthrough(); - } - const params = new URLSearchParams(bodyText); - actualBody = {}; - for (const [key, value] of params.entries()) { - actualBody[key] = value; - } - } catch (error) { - console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).length > 0) { - console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - return { value: { actual, expected } }; - } - return {}; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if (actual[key] !== expected[key]) { - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts deleted file mode 100644 index 6599d2b4a92d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -/** - * Creates a request matcher that validates if request headers match specified criteria - * @param expectedHeaders - Headers to match against - * @param resolver - Response resolver to execute if headers match - */ -export function withHeaders( - expectedHeaders: Record boolean)>, - resolver: HttpResponseResolver, -): HttpResponseResolver { - return (args) => { - const { request } = args; - const { headers } = request; - - const mismatches: Record< - string, - { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } - > = {}; - - for (const [key, expectedValue] of Object.entries(expectedHeaders)) { - const actualValue = headers.get(key); - - if (actualValue === null) { - mismatches[key] = { actual: null, expected: expectedValue }; - continue; - } - - if (typeof expectedValue === "function") { - if (!expectedValue(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue instanceof RegExp) { - if (!expectedValue.test(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue !== actualValue) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } - - if (Object.keys(mismatches).length > 0) { - const formattedMismatches = formatHeaderMismatches(mismatches); - console.error("Header mismatch:", formattedMismatches); - return passthrough(); - } - - return resolver(args); - }; -} - -function formatHeaderMismatches( - mismatches: Record boolean) }>, -): Record { - const formatted: Record = {}; - - for (const [key, { actual, expected }] of Object.entries(mismatches)) { - formatted[key] = { - actual, - expected: - expected instanceof RegExp - ? expected.toString() - : typeof expected === "function" - ? "[Function]" - : expected, - }; - } - - return formatted; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts deleted file mode 100644 index b627638b015f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { fromJson, toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request JSON body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: unknown; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a JSON object."); - return passthrough(); - } - actualBody = fromJson(bodyText); - } catch (error) { - console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { - console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - return {}; - } - - if (Array.isArray(actual) && Array.isArray(expected)) { - if (actual.length !== expected.length) { - return { length: { actual: actual.length, expected: expected.length } }; - } - - const arrayMismatches: Record = {}; - for (let i = 0; i < actual.length; i++) { - const itemMismatches = findMismatches(actual[i], expected[i]); - if (Object.keys(itemMismatches).length > 0) { - for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { - arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; - } - } - } - return arrayMismatches; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; // Skip undefined values in actual - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; // Skip undefined values in expected - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if ( - typeof actual[key] === "object" && - actual[key] !== null && - typeof expected[key] === "object" && - expected[key] !== null - ) { - const nestedMismatches = findMismatches(actual[key], expected[key]); - if (Object.keys(nestedMismatches).length > 0) { - for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { - mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; - } - } - } else if (actual[key] !== expected[key]) { - if (areEquivalent(actual[key], expected[key])) { - continue; - } - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} - -function areEquivalent(actual: unknown, expected: unknown): boolean { - if (actual === expected) { - return true; - } - if (isEquivalentBigInt(actual, expected)) { - return true; - } - if (isEquivalentDatetime(actual, expected)) { - return true; - } - return false; -} - -function isEquivalentBigInt(actual: unknown, expected: unknown) { - if (typeof actual === "number") { - actual = BigInt(actual); - } - if (typeof expected === "number") { - expected = BigInt(expected); - } - if (typeof actual === "bigint" && typeof expected === "bigint") { - return actual === expected; - } - return false; -} - -function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { - if (typeof str1 !== "string" || typeof str2 !== "string") { - return false; - } - const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; - if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { - return false; - } - - try { - const date1 = new Date(str1).getTime(); - const date2 = new Date(str2).getTime(); - return date1 === date2; - } catch { - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts deleted file mode 100644 index a5651f81ba10..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { expect } from "vitest"; - -interface CustomMatchers { - toContainHeaders(expectedHeaders: Record): R; -} - -declare module "vitest" { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} - -expect.extend({ - toContainHeaders(actual: unknown, expectedHeaders: Record) { - const isHeaders = actual instanceof Headers; - const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); - - if (!isHeaders && !isPlainObject) { - throw new TypeError("Received value must be an instance of Headers or a plain object!"); - } - - if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { - throw new TypeError("Expected headers must be a plain object!"); - } - - const missingHeaders: string[] = []; - const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; - - for (const [key, value] of Object.entries(expectedHeaders)) { - let actualValue: string | null = null; - - if (isHeaders) { - // Headers.get() is already case-insensitive - actualValue = (actual as Headers).get(key); - } else { - // For plain objects, do case-insensitive lookup - const actualObj = actual as Record; - const lowerKey = key.toLowerCase(); - const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); - actualValue = foundKey ? actualObj[foundKey] : null; - } - - if (actualValue === null || actualValue === undefined) { - missingHeaders.push(key); - } else if (actualValue !== value) { - mismatchedHeaders.push({ key, expected: value, actual: actualValue }); - } - } - - const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; - - const actualType = isHeaders ? "Headers" : "object"; - - if (pass) { - return { - message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, - pass: true, - }; - } else { - const messages: string[] = []; - - if (missingHeaders.length > 0) { - messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); - } - - if (mismatchedHeaders.length > 0) { - const mismatches = mismatchedHeaders.map( - ({ key, expected, actual }) => - `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, - ); - messages.push(mismatches.join("\n")); - } - - return { - message: () => - `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, - pass: false, - }; - } - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json deleted file mode 100644 index a477df47920c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": null, - "rootDir": "..", - "baseUrl": "..", - "types": ["vitest/globals"] - }, - "include": ["../src", "../tests"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts deleted file mode 100644 index 9b5123364c47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { BasicAuth } from "../../../src/core/auth/BasicAuth"; - -describe("BasicAuth", () => { - interface ToHeaderTestCase { - description: string; - input: { username: string; password: string }; - expected: string; - } - - interface FromHeaderTestCase { - description: string; - input: string; - expected: { username: string; password: string }; - } - - interface ErrorTestCase { - description: string; - input: string; - expectedError: string; - } - - describe("toAuthorizationHeader", () => { - const toHeaderTests: ToHeaderTestCase[] = [ - { - description: "correctly converts to header", - input: { username: "username", password: "password" }, - expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - }, - ]; - - toHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); - }); - }); - }); - - describe("fromAuthorizationHeader", () => { - const fromHeaderTests: FromHeaderTestCase[] = [ - { - description: "correctly parses header", - input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - expected: { username: "username", password: "password" }, - }, - { - description: "handles password with colons", - input: "Basic dXNlcjpwYXNzOndvcmQ=", - expected: { username: "user", password: "pass:word" }, - }, - { - description: "handles empty username and password (just colon)", - input: "Basic Og==", - expected: { username: "", password: "" }, - }, - { - description: "handles empty username", - input: "Basic OnBhc3N3b3Jk", - expected: { username: "", password: "password" }, - }, - { - description: "handles empty password", - input: "Basic dXNlcm5hbWU6", - expected: { username: "username", password: "" }, - }, - ]; - - fromHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); - }); - }); - - const errorTests: ErrorTestCase[] = [ - { - description: "throws error for completely empty credentials", - input: "Basic ", - expectedError: "Invalid basic auth", - }, - { - description: "throws error for credentials without colon", - input: "Basic dXNlcm5hbWU=", - expectedError: "Invalid basic auth", - }, - ]; - - errorTests.forEach(({ description, input, expectedError }) => { - it(description, () => { - expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts deleted file mode 100644 index 7757b87cb97e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BearerToken } from "../../../src/core/auth/BearerToken"; - -describe("BearerToken", () => { - describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); - }); - }); - describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts deleted file mode 100644 index 939594ca277b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { base64Decode, base64Encode } from "../../src/core/base64"; - -describe("base64", () => { - describe("base64Encode", () => { - it("should encode ASCII strings", () => { - expect(base64Encode("hello")).toBe("aGVsbG8="); - expect(base64Encode("")).toBe(""); - }); - - it("should encode UTF-8 strings", () => { - expect(base64Encode("café")).toBe("Y2Fmw6k="); - expect(base64Encode("🎉")).toBe("8J+OiQ=="); - }); - - it("should handle basic auth credentials", () => { - expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); - }); - }); - - describe("base64Decode", () => { - it("should decode ASCII strings", () => { - expect(base64Decode("aGVsbG8=")).toBe("hello"); - expect(base64Decode("")).toBe(""); - }); - - it("should decode UTF-8 strings", () => { - expect(base64Decode("Y2Fmw6k=")).toBe("café"); - expect(base64Decode("8J+OiQ==")).toBe("🎉"); - }); - - it("should handle basic auth credentials", () => { - expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); - }); - }); - - describe("round-trip encoding", () => { - const testStrings = [ - "hello world", - "test@example.com", - "café", - "username:password", - "user@domain.com:super$ecret123!", - ]; - - testStrings.forEach((testString) => { - it(`should round-trip encode/decode: "${testString}"`, () => { - const encoded = base64Encode(testString); - const decoded = base64Decode(encoded); - expect(decoded).toBe(testString); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts deleted file mode 100644 index 60df2b5e4824..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts +++ /dev/null @@ -1,261 +0,0 @@ -import fs from "fs"; -import { join } from "path"; -import stream from "stream"; -import type { BinaryResponse } from "../../../src/core"; -import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -describe("Test fetcherImpl", () => { - it("should handle successful request", async () => { - const mockArgs: Fetcher.Args = { - url: "https://httpbin.org/post", - method: "POST", - headers: { "X-Test": "x-test-header" }, - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - maxRetries: 0, - responseType: "json", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - - expect(global.fetch).toHaveBeenCalledWith( - "https://httpbin.org/post", - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: JSON.stringify({ data: "test" }), - }), - ); - }); - - it("should send octet stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "POST", - headers: { "X-Test": "x-test-header" }, - contentType: "application/octet-stream", - requestType: "bytes", - maxRetries: 0, - responseType: "json", - body: fs.createReadStream(join(__dirname, "test-file.txt")), - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: expect.any(fs.ReadStream), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - }); - - it("should receive file as stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.stream).toBe("function"); - const stream = body.stream(); - expect(stream).toBeInstanceOf(ReadableStream); - const reader = stream.getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as blob", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.blob).toBe("function"); - const blob = await body.blob(); - expect(blob).toBeInstanceOf(Blob); - const reader = blob.stream().getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as arraybuffer", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.arrayBuffer).toBe("function"); - const arrayBuffer = await body.arrayBuffer(); - expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as bytes", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.bytes).toBe("function"); - if (!body.bytes) { - return; - } - const bytes = await body.bytes(); - expect(bytes).toBeInstanceOf(Uint8Array); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(bytes); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts deleted file mode 100644 index 2ec008e581d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; - -import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; -import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("HttpResponsePromise", () => { - const mockRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - const mockData = { id: "123", name: "test" }; - const mockWithRawResponse: WithRawResponse = { - data: mockData, - rawResponse: mockRawResponse, - }; - - describe("fromFunction", () => { - it("should create an HttpResponsePromise from a function", async () => { - const mockFn = vi - .fn<(arg1: string, arg2: string) => Promise>>() - .mockResolvedValue(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); - - const result = await responsePromise; - expect(result).toEqual(mockData); - expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromPromise", () => { - it("should create an HttpResponsePromise from a promise", async () => { - const promise = Promise.resolve(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromPromise(promise); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromExecutor", () => { - it("should create an HttpResponsePromise from an executor function", async () => { - const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { - resolve(mockWithRawResponse); - }); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromResult", () => { - it("should create an HttpResponsePromise from a result", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("Promise methods", () => { - let responsePromise: HttpResponsePromise; - - beforeEach(() => { - responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - }); - - it("should support then() method", async () => { - const result = await responsePromise.then((data) => ({ - ...data, - modified: true, - })); - - expect(result).toEqual({ - ...mockData, - modified: true, - }); - }); - - it("should support catch() method", async () => { - const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { - reject(new Error("Test error")); - }); - - const catchSpy = vi.fn(); - await errorResponsePromise.catch(catchSpy); - - expect(catchSpy).toHaveBeenCalled(); - const error = catchSpy.mock.calls[0]?.[0]; - expect(error).toBeInstanceOf(Error); - expect((error as Error).message).toBe("Test error"); - }); - - it("should support finally() method", async () => { - const finallySpy = vi.fn(); - await responsePromise.finally(finallySpy); - - expect(finallySpy).toHaveBeenCalled(); - }); - }); - - describe("withRawResponse", () => { - it("should return both data and raw response", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise.withRawResponse(); - - expect(result).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts deleted file mode 100644 index 375ee3f38064..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("RawResponse", () => { - describe("toRawResponse", () => { - it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { - const mockHeaders = new Headers({ "content-type": "application/json" }); - const mockResponse = { - body: "test body", - bodyUsed: false, - ok: true, - headers: mockHeaders, - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - - const result = toRawResponse(mockResponse as unknown as Response); - - expect("body" in result).toBe(false); - expect("bodyUsed" in result).toBe(false); - expect("ok" in result).toBe(false); - expect(result.headers).toBe(mockHeaders); - expect(result.redirected).toBe(false); - expect(result.status).toBe(200); - expect(result.statusText).toBe("OK"); - expect(result.type).toBe("basic"); - expect(result.url).toBe("https://example.com"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts deleted file mode 100644 index a92f1b5e81d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; - -describe("Test createRequestUrl", () => { - const BASE_URL = "https://api.example.com"; - - interface TestCase { - description: string; - baseUrl: string; - queryParams?: Record; - expected: string; - } - - const testCases: TestCase[] = [ - { - description: "should return the base URL when no query parameters are provided", - baseUrl: BASE_URL, - expected: BASE_URL, - }, - { - description: "should append simple query parameters", - baseUrl: BASE_URL, - queryParams: { key: "value", another: "param" }, - expected: "https://api.example.com?key=value&another=param", - }, - { - description: "should handle array query parameters", - baseUrl: BASE_URL, - queryParams: { items: ["a", "b", "c"] }, - expected: "https://api.example.com?items=a&items=b&items=c", - }, - { - description: "should handle object query parameters", - baseUrl: BASE_URL, - queryParams: { filter: { name: "John", age: 30 } }, - expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", - }, - { - description: "should handle mixed types of query parameters", - baseUrl: BASE_URL, - queryParams: { - simple: "value", - array: ["x", "y"], - object: { key: "value" }, - }, - expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", - }, - { - description: "should handle empty query parameters object", - baseUrl: BASE_URL, - queryParams: {}, - expected: BASE_URL, - }, - { - description: "should encode special characters in query parameters", - baseUrl: BASE_URL, - queryParams: { special: "a&b=c d" }, - expected: "https://api.example.com?special=a%26b%3Dc%20d", - }, - { - description: "should handle numeric values", - baseUrl: BASE_URL, - queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, - expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", - }, - { - description: "should handle boolean values", - baseUrl: BASE_URL, - queryParams: { enabled: true, disabled: false }, - expected: "https://api.example.com?enabled=true&disabled=false", - }, - { - description: "should handle null and undefined values", - baseUrl: BASE_URL, - queryParams: { - valid: "value", - nullValue: null, - undefinedValue: undefined, - emptyString: "", - }, - expected: "https://api.example.com?valid=value&nullValue=&emptyString=", - }, - { - description: "should handle deeply nested objects", - baseUrl: BASE_URL, - queryParams: { - user: { - profile: { - name: "John", - settings: { theme: "dark" }, - }, - }, - }, - expected: - "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle arrays of objects", - baseUrl: BASE_URL, - queryParams: { - users: [ - { name: "John", age: 30 }, - { name: "Jane", age: 25 }, - ], - }, - expected: - "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", - }, - { - description: "should handle mixed arrays", - baseUrl: BASE_URL, - queryParams: { - mixed: ["string", 42, true, { key: "value" }], - }, - expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", - }, - { - description: "should handle empty arrays", - baseUrl: BASE_URL, - queryParams: { emptyArray: [] }, - expected: BASE_URL, - }, - { - description: "should handle empty objects", - baseUrl: BASE_URL, - queryParams: { emptyObject: {} }, - expected: BASE_URL, - }, - { - description: "should handle special characters in keys", - baseUrl: BASE_URL, - queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, - expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", - }, - { - description: "should handle URL with existing query parameters", - baseUrl: "https://api.example.com?existing=param", - queryParams: { new: "value" }, - expected: "https://api.example.com?existing=param?new=value", - }, - { - description: "should handle complex nested structures", - baseUrl: BASE_URL, - queryParams: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - ]; - - testCases.forEach(({ description, baseUrl, queryParams, expected }) => { - it(description, () => { - expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts deleted file mode 100644 index 8a6c3a57e211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getRequestBody", () => { - interface TestCase { - description: string; - input: any; - type: "json" | "form" | "file" | "bytes" | "other"; - expected: any; - skipCondition?: () => boolean; - } - - const testCases: TestCase[] = [ - { - description: "should stringify body if not FormData in Node environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "node", - }, - { - description: "should stringify body if not FormData in browser environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "browser", - }, - { - description: "should return the Uint8Array", - input: new Uint8Array([1, 2, 3]), - type: "bytes", - expected: new Uint8Array([1, 2, 3]), - }, - { - description: "should serialize objects for form-urlencoded content type", - input: { username: "johndoe", email: "john@example.com" }, - type: "form", - expected: "username=johndoe&email=john%40example.com", - }, - { - description: "should serialize complex nested objects and arrays for form-urlencoded content type", - input: { - user: { - profile: { - name: "John Doe", - settings: { - theme: "dark", - notifications: true, - }, - }, - tags: ["admin", "user"], - contacts: [ - { type: "email", value: "john@example.com" }, - { type: "phone", value: "+1234567890" }, - ], - }, - filters: { - status: ["active", "pending"], - metadata: { - created: "2024-01-01", - categories: ["electronics", "books"], - }, - }, - preferences: ["notifications", "updates"], - }, - type: "form", - expected: - "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + - "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + - "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + - "user%5Btags%5D=admin&" + - "user%5Btags%5D=user&" + - "user%5Bcontacts%5D%5Btype%5D=email&" + - "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + - "user%5Bcontacts%5D%5Btype%5D=phone&" + - "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + - "filters%5Bstatus%5D=active&" + - "filters%5Bstatus%5D=pending&" + - "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + - "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + - "filters%5Bmetadata%5D%5Bcategories%5D=books&" + - "preferences=notifications&" + - "preferences=updates", - }, - { - description: "should return the input for pre-serialized form-urlencoded strings", - input: "key=value&another=param", - type: "other", - expected: "key=value&another=param", - }, - { - description: "should JSON stringify objects", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - }, - ]; - - testCases.forEach(({ description, input, type, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const result = await getRequestBody({ - body: input, - type, - }); - - if (input instanceof Uint8Array) { - expect(result).toBe(input); - } else { - expect(result).toBe(expected); - } - }); - }); - - it("should return FormData in browser environment", async () => { - if (RUNTIME.type === "browser") { - const formData = new FormData(); - formData.append("key", "value"); - const result = await getRequestBody({ - body: formData, - type: "file", - }); - expect(result).toBe(formData); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts deleted file mode 100644 index ad6be7fc2c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; - -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getResponseBody", () => { - interface SimpleTestCase { - description: string; - responseData: string | Record; - responseType?: "blob" | "sse" | "streaming" | "text"; - expected: any; - skipCondition?: () => boolean; - } - - const simpleTestCases: SimpleTestCase[] = [ - { - description: "should handle text response type", - responseData: "test text", - responseType: "text", - expected: "test text", - }, - { - description: "should handle JSON response", - responseData: { key: "value" }, - expected: { key: "value" }, - }, - { - description: "should handle empty response", - responseData: "", - expected: undefined, - }, - { - description: "should handle non-JSON response", - responseData: "invalid json", - expected: { - ok: false, - error: { - reason: "non-json", - statusCode: 200, - rawBody: "invalid json", - }, - }, - }, - ]; - - simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const mockResponse = new Response( - typeof responseData === "string" ? responseData : JSON.stringify(responseData), - ); - const result = await getResponseBody(mockResponse, responseType); - expect(result).toEqual(expected); - }); - }); - - it("should handle blob response type", async () => { - const mockBlob = new Blob(["test"], { type: "text/plain" }); - const mockResponse = new Response(mockBlob); - const result = await getResponseBody(mockResponse, "blob"); - // @ts-expect-error - expect(result.constructor.name).toBe("Blob"); - }); - - it("should handle sse response type", async () => { - if (RUNTIME.type === "node") { - const mockStream = new ReadableStream(); - const mockResponse = new Response(mockStream); - const result = await getResponseBody(mockResponse, "sse"); - expect(result).toBe(mockStream); - } - }); - - it("should handle streaming response type", async () => { - const encoder = new TextEncoder(); - const testData = "test stream data"; - const mockStream = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode(testData)); - controller.close(); - }, - }); - - const mockResponse = new Response(mockStream); - const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; - - expect(result).toBeInstanceOf(ReadableStream); - - const reader = result.getReader(); - const decoder = new TextDecoder(); - const { value } = await reader.read(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe(testData); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts deleted file mode 100644 index 366c9b6ced61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts +++ /dev/null @@ -1,517 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Fetcher Logging Integration", () => { - describe("Request Logging", () => { - it("should log successful request at debug level", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - headers: { "Content-Type": "application/json" }, - body: { test: "data" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - }), - hasBody: true, - }), - ); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - statusCode: 200, - }), - ); - }); - - it("should not log debug messages at info level for successful requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "info", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - }); - - it("should log request with body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: true, - }), - ); - }); - - it("should log request without body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: false, - }), - ); - }); - - it("should not log when silent mode is enabled", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: true, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should not log when no logging config is provided", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Error Logging", () => { - it("should log 4xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Not found" }, 404, "Not Found"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 404, - }), - ); - }); - - it("should log 5xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 500, - }), - ); - }); - - it("should log aborted request errors", async () => { - const mockLogger = createMockLogger(); - - const abortController = new AbortController(); - abortController.abort(); - - global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - abortSignal: abortController.signal, - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request was aborted", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - }), - ); - }); - - it("should log timeout errors", async () => { - const mockLogger = createMockLogger(); - - const timeoutError = new Error("Request timeout"); - timeoutError.name = "AbortError"; - - global.fetch = vi.fn().mockRejectedValue(timeoutError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request timed out", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - timeoutMs: undefined, - }), - ); - }); - - it("should log unknown errors", async () => { - const mockLogger = createMockLogger(); - - const unknownError = new Error("Unknown error"); - - global.fetch = vi.fn().mockRejectedValue(unknownError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - errorMessage: "Unknown error", - }), - ); - }); - }); - - describe("Logging with Redaction", () => { - it("should redact sensitive data in error logs", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]", - }), - ); - }); - }); - - describe("Different HTTP Methods", () => { - it("should log GET requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "GET", - }), - ); - }); - - it("should log POST requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - }), - ); - }); - - it("should log PUT requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "PUT", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "PUT", - }), - ); - }); - - it("should log DELETE requests", async () => { - const mockLogger = createMockLogger(); - global.fetch = vi.fn().mockResolvedValue( - new Response(null, { - status: 200, - statusText: "OK", - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "DELETE", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "DELETE", - }), - ); - }); - }); - - describe("Status Code Logging", () => { - it("should log 2xx success status codes", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 201, - }), - ); - }); - - it("should log 3xx redirect status codes as success", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 301, - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts deleted file mode 100644 index ea49466a55fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Mock } from "vitest"; -import { makeRequest } from "../../../src/core/fetcher/makeRequest"; - -describe("Test makeRequest", () => { - const mockPostUrl = "https://httpbin.org/post"; - const mockGetUrl = "https://httpbin.org/get"; - const mockHeaders = { "Content-Type": "application/json" }; - const mockBody = JSON.stringify({ key: "value" }); - - let mockFetch: Mock; - - beforeEach(() => { - mockFetch = vi.fn(); - mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); - }); - - it("should handle POST request correctly", async () => { - const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockPostUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "POST", - headers: mockHeaders, - body: mockBody, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); - - it("should handle GET request correctly", async () => { - const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockGetUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "GET", - headers: mockHeaders, - body: undefined, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts deleted file mode 100644 index d599376b9bcf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts +++ /dev/null @@ -1,1115 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Redacting Logic", () => { - describe("Header Redaction", () => { - it("should redact authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Authorization: "Bearer secret-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - }), - }), - ); - }); - - it("should redact api-key header (case-insensitive)", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-API-KEY": "secret-api-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-API-KEY": "[REDACTED]", - }), - }), - ); - }); - - it("should redact cookie header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Cookie: "session=abc123; token=xyz789" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Cookie: "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-auth-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "x-auth-token": "auth-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "x-auth-token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact proxy-authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "Proxy-Authorization": "Basic credentials" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Proxy-Authorization": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-csrf-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-CSRF-Token": "csrf-token-abc" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-CSRF-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact www-authenticate header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "WWW-Authenticate": "Bearer realm=example" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "WWW-Authenticate": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-session-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-Session-Token": "session-token-xyz" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-Session-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive headers", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }), - }), - ); - }); - - it("should redact multiple sensitive headers at once", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - Authorization: "Bearer token", - "X-API-Key": "api-key", - Cookie: "session=123", - "Content-Type": "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - "X-API-Key": "[REDACTED]", - Cookie: "[REDACTED]", - "Content-Type": "application/json", - }), - }), - ); - }); - }); - - describe("Response Header Redaction", () => { - it("should redact Set-Cookie in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "set-cookie": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact authorization in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Authorization", "Bearer token-123"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - authorization: "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact response headers in error responses", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - statusText: "Unauthorized", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "www-authenticate": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - }); - - describe("Query Parameter Redaction", () => { - it("should redact api_key query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { api_key: "secret-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - api_key: "[REDACTED]", - }), - }), - ); - }); - - it("should redact token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact access_token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { access_token: "secret-access-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - access_token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact password query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { password: "secret-password" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - password: "[REDACTED]", - }), - }), - ); - }); - - it("should redact secret query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { secret: "secret-value" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - secret: "[REDACTED]", - }), - }), - ); - }); - - it("should redact session_id query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { session_id: "session-123" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - session_id: "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - page: "1", - limit: "10", - sort: "name", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - page: "1", - limit: "10", - sort: "name", - }), - }), - ); - }); - - it("should not redact parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - author: "john", - authenticate: "false", - authorization_level: "user", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - author: "john", - authenticate: "false", - authorization_level: "user", - }), - }), - ); - }); - - it("should handle undefined query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: undefined, - }), - ); - }); - - it("should redact case-insensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - API_KEY: "[REDACTED]", - Token: "[REDACTED]", - }), - }), - ); - }); - }); - - describe("URL Redaction", () => { - it("should redact credentials in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:password@example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api", - }), - ); - }); - - it("should redact api_key in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret-key&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&page=1", - }), - ); - }); - - it("should redact token in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret-token", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should redact password in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?username=user&password=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?username=user&password=[REDACTED]", - }), - ); - }); - - it("should not redact non-sensitive query strings", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name", - }), - ); - }); - - it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - }), - ); - }); - - it("should handle URL with fragment", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret#section", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]#section", - }), - ); - }); - - it("should redact URL-encoded query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api%5Fkey=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api%5Fkey=[REDACTED]", - }), - ); - }); - - it("should handle URL without query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api", - }), - ); - }); - - it("should handle empty query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?", - }), - ); - }); - - it("should redact multiple sensitive parameters in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret1&token=secret2&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", - }), - ); - }); - - it("should redact both credentials and query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/api?token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should use fast path for URLs without sensitive keywords", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - }), - ); - }); - - it("should handle query parameter without value", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?flag&token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?flag&token=[REDACTED]", - }), - ); - }); - - it("should handle URL with multiple @ symbols in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user@example.com:pass@host.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@host.com/api", - }), - ); - }); - - it("should handle URL with @ in query parameter but not in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?email=user@example.com", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?email=user@example.com", - }), - ); - }); - - it("should handle URL with both credentials and @ in path", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/users/@username", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/users/@username", - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts deleted file mode 100644 index d22661367f4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -import type { Mock, MockInstance } from "vitest"; -import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; - -describe("requestWithRetries", () => { - let mockFetch: Mock; - let originalMathRandom: typeof Math.random; - let setTimeoutSpy: MockInstance; - - beforeEach(() => { - mockFetch = vi.fn(); - originalMathRandom = Math.random; - - Math.random = vi.fn(() => 0.5); - - vi.useFakeTimers({ - toFake: [ - "setTimeout", - "clearTimeout", - "setInterval", - "clearInterval", - "setImmediate", - "clearImmediate", - "Date", - "performance", - "requestAnimationFrame", - "cancelAnimationFrame", - "requestIdleCallback", - "cancelIdleCallback", - ], - }); - }); - - afterEach(() => { - Math.random = originalMathRandom; - vi.clearAllMocks(); - vi.clearAllTimers(); - }); - - it("should retry on retryable status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const retryableStatuses = [408, 429, 500, 502]; - let callCount = 0; - - mockFetch.mockImplementation(async () => { - if (callCount < retryableStatuses.length) { - return new Response("", { status: retryableStatuses[callCount++] }); - } - return new Response("", { status: 200 }); - }); - - const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); - expect(response.status).toBe(200); - }); - - it("should respect maxRetries limit", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const maxRetries = 2; - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - expect(response.status).toBe(500); - }); - - it("should not retry on success status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const successStatuses = [200, 201, 202]; - - for (const status of successStatuses) { - mockFetch.mockReset(); - setTimeoutSpy.mockClear(); - mockFetch.mockResolvedValueOnce(new Response("", { status })); - - const responsePromise = requestWithRetries(() => mockFetch(), 3); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(1); - expect(setTimeoutSpy).not.toHaveBeenCalled(); - } - }); - - interface RetryHeaderTestCase { - description: string; - headerName: string; - headerValue: string | (() => string); - expectedDelayMin: number; - expectedDelayMax: number; - } - - const retryHeaderTests: RetryHeaderTestCase[] = [ - { - description: "should respect retry-after header with seconds value", - headerName: "retry-after", - headerValue: "5", - expectedDelayMin: 4000, - expectedDelayMax: 6000, - }, - { - description: "should respect retry-after header with HTTP date value", - headerName: "retry-after", - headerValue: () => new Date(Date.now() + 3000).toUTCString(), - expectedDelayMin: 2000, - expectedDelayMax: 4000, - }, - { - description: "should respect x-ratelimit-reset header", - headerName: "x-ratelimit-reset", - headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), - expectedDelayMin: 3000, - expectedDelayMax: 6000, - }, - ]; - - retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { - it(description, async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const value = typeof headerValue === "function" ? headerValue() : headerValue; - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ [headerName]: value }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(expectedDelayMin); - expect(actualDelay).toBeLessThan(expectedDelayMax); - expect(response.status).toBe(200); - }); - }); - - it("should apply correct exponential backoff with jitter", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - const maxRetries = 3; - const expectedDelays = [1000, 2000, 4000]; - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); - - expectedDelays.forEach((delay, index) => { - expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); - }); - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - }); - - it("should handle concurrent retries independently", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 200 })) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const promise1 = requestWithRetries(() => mockFetch(), 1); - const promise2 = requestWithRetries(() => mockFetch(), 1); - - await vi.runAllTimersAsync(); - const [response1, response2] = await Promise.all([promise1, promise2]); - - expect(response1.status).toBe(200); - expect(response2.status).toBe(200); - }); - - it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); - expect(response.status).toBe(200); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts deleted file mode 100644 index d7b6d1e63caa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; - -describe("Test getTimeoutSignal", () => { - beforeEach(() => { - vi.useFakeTimers(); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - it("should return an object with signal and abortId", () => { - const { signal, abortId } = getTimeoutSignal(1000); - - expect(signal).toBeDefined(); - expect(abortId).toBeDefined(); - expect(signal).toBeInstanceOf(AbortSignal); - expect(signal.aborted).toBe(false); - }); - - it("should create a signal that aborts after the specified timeout", () => { - const timeoutMs = 5000; - const { signal } = getTimeoutSignal(timeoutMs); - - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(timeoutMs - 1); - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(1); - expect(signal.aborted).toBe(true); - }); -}); - -describe("Test anySignal", () => { - it("should return an AbortSignal", () => { - const signal = anySignal(new AbortController().signal); - expect(signal).toBeInstanceOf(AbortSignal); - }); - - it("should abort when any of the input signals is aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal(controller1.signal, controller2.signal); - - expect(signal.aborted).toBe(false); - controller1.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should handle an array of signals", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal([controller1.signal, controller2.signal]); - - expect(signal.aborted).toBe(false); - controller2.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should abort immediately if one of the input signals is already aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - controller1.abort(); - - const signal = anySignal(controller1.signal, controller2.signal); - expect(signal.aborted).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt deleted file mode 100644 index c66d471e359c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts deleted file mode 100644 index 2e0b5fe5040c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts +++ /dev/null @@ -1,454 +0,0 @@ -import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -describe("Logger", () => { - describe("LogLevel", () => { - it("should have correct log levels", () => { - expect(LogLevel.Debug).toBe("debug"); - expect(LogLevel.Info).toBe("info"); - expect(LogLevel.Warn).toBe("warn"); - expect(LogLevel.Error).toBe("error"); - }); - }); - - describe("ConsoleLogger", () => { - let consoleLogger: ConsoleLogger; - let consoleSpy: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - consoleLogger = new ConsoleLogger(); - consoleSpy = { - debug: vi.spyOn(console, "debug").mockImplementation(() => {}), - info: vi.spyOn(console, "info").mockImplementation(() => {}), - warn: vi.spyOn(console, "warn").mockImplementation(() => {}), - error: vi.spyOn(console, "error").mockImplementation(() => {}), - }; - }); - - afterEach(() => { - consoleSpy.debug.mockRestore(); - consoleSpy.info.mockRestore(); - consoleSpy.warn.mockRestore(); - consoleSpy.error.mockRestore(); - }); - - it("should log debug messages", () => { - consoleLogger.debug("debug message", { data: "test" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); - }); - - it("should log info messages", () => { - consoleLogger.info("info message", { data: "test" }); - expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); - }); - - it("should log warn messages", () => { - consoleLogger.warn("warn message", { data: "test" }); - expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); - }); - - it("should log error messages", () => { - consoleLogger.error("error message", { data: "test" }); - expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); - }); - - it("should handle multiple arguments", () => { - consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); - }); - }); - - describe("Logger with level filtering", () => { - let mockLogger: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - mockLogger = createMockLogger(); - }); - - describe("Debug level", () => { - it("should log all levels when set to debug", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).toHaveBeenCalledWith("debug"); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(true); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Info level", () => { - it("should log info, warn, and error when set to info", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Warn level", () => { - it("should log warn and error when set to warn", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Error level", () => { - it("should only log error when set to error", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Silent mode", () => { - it("should not log anything when silent is true", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should report all level checks as false when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(false); - }); - }); - - describe("shouldLog", () => { - it("should correctly determine if level should be logged", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(true); - expect(logger.shouldLog(LogLevel.Warn)).toBe(true); - expect(logger.shouldLog(LogLevel.Error)).toBe(true); - }); - - it("should return false for all levels when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - expect(logger.shouldLog(LogLevel.Warn)).toBe(false); - expect(logger.shouldLog(LogLevel.Error)).toBe(false); - }); - }); - - describe("Multiple arguments", () => { - it("should pass multiple arguments to logger", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message", "arg1", { key: "value" }, 123); - expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); - }); - }); - }); - - describe("createLogger", () => { - it("should return default logger when no config provided", () => { - const logger = createLogger(); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should return same logger instance when Logger is passed", () => { - const customLogger = new Logger({ - level: LogLevel.Debug, - logger: new ConsoleLogger(), - silent: false, - }); - - const result = createLogger(customLogger); - expect(result).toBe(customLogger); - }); - - it("should create logger with custom config", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger).toBeInstanceOf(Logger); - logger.warn("test"); - expect(mockLogger.warn).toHaveBeenCalledWith("test"); - }); - - it("should use default values for missing config", () => { - const logger = createLogger({}); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should override default level", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("test"); - expect(mockLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should override default silent mode", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - silent: false, - }); - - logger.info("test"); - expect(mockLogger.info).toHaveBeenCalledWith("test"); - }); - - it("should use provided logger implementation", () => { - const customLogger = createMockLogger(); - - const logger = createLogger({ - logger: customLogger, - level: LogLevel.Debug, - silent: false, - }); - - logger.debug("test"); - expect(customLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should default to silent: true", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - level: LogLevel.Debug, - }); - - logger.debug("test"); - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Default logger", () => { - it("should have silent: true by default", () => { - const logger = createLogger(); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - }); - - it("should not log when using default logger", () => { - const logger = createLogger(); - - logger.info("test"); - expect(logger.isInfo()).toBe(false); - }); - }); - - describe("Edge cases", () => { - it("should handle empty message", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug(""); - expect(mockLogger.debug).toHaveBeenCalledWith(""); - }); - - it("should handle no arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message"); - expect(mockLogger.debug).toHaveBeenCalledWith("message"); - }); - - it("should handle complex objects", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - const complexObject = { - nested: { key: "value" }, - array: [1, 2, 3], - fn: () => "test", - }; - - logger.debug("message", complexObject); - expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); - }); - - it("should handle errors as arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - const error = new Error("Test error"); - logger.error("Error occurred", error); - expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts deleted file mode 100644 index 123488f084ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { join } from "../../../src/core/url/index"; - -describe("join", () => { - interface TestCase { - description: string; - base: string; - segments: string[]; - expected: string; - } - - describe("basic functionality", () => { - const basicTests: TestCase[] = [ - { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, - { - description: "should return empty string for empty base with path", - base: "", - segments: ["path"], - expected: "", - }, - { - description: "should handle single segment", - base: "base", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with trailing slash on base", - base: "base/", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with leading slash", - base: "base", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with both slashes", - base: "base/", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle multiple segments", - base: "base", - segments: ["path1", "path2", "path3"], - expected: "base/path1/path2/path3", - }, - { - description: "should handle multiple segments with slashes", - base: "base/", - segments: ["/path1/", "/path2/", "/path3/"], - expected: "base/path1/path2/path3/", - }, - ]; - - basicTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("URL handling", () => { - const urlTests: TestCase[] = [ - { - description: "should handle absolute URLs", - base: "https://example.com", - segments: ["api", "v1"], - expected: "https://example.com/api/v1", - }, - { - description: "should handle absolute URLs with slashes", - base: "https://example.com/", - segments: ["/api/", "/v1/"], - expected: "https://example.com/api/v1/", - }, - { - description: "should handle absolute URLs with base path", - base: "https://example.com/base", - segments: ["api", "v1"], - expected: "https://example.com/base/api/v1", - }, - { - description: "should preserve URL query parameters", - base: "https://example.com?query=1", - segments: ["api"], - expected: "https://example.com/api?query=1", - }, - { - description: "should preserve URL fragments", - base: "https://example.com#fragment", - segments: ["api"], - expected: "https://example.com/api#fragment", - }, - { - description: "should preserve URL query and fragments", - base: "https://example.com?query=1#fragment", - segments: ["api"], - expected: "https://example.com/api?query=1#fragment", - }, - { - description: "should handle http protocol", - base: "http://example.com", - segments: ["api"], - expected: "http://example.com/api", - }, - { - description: "should handle ftp protocol", - base: "ftp://example.com", - segments: ["files"], - expected: "ftp://example.com/files", - }, - { - description: "should handle ws protocol", - base: "ws://example.com", - segments: ["socket"], - expected: "ws://example.com/socket", - }, - { - description: "should fallback to path joining for malformed URLs", - base: "not-a-url://", - segments: ["path"], - expected: "not-a-url:///path", - }, - ]; - - urlTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("edge cases", () => { - const edgeCaseTests: TestCase[] = [ - { - description: "should handle empty segments", - base: "base", - segments: ["", "path"], - expected: "base/path", - }, - { - description: "should handle null segments", - base: "base", - segments: [null as any, "path"], - expected: "base/path", - }, - { - description: "should handle undefined segments", - base: "base", - segments: [undefined as any, "path"], - expected: "base/path", - }, - { - description: "should handle segments with only single slash", - base: "base", - segments: ["/", "path"], - expected: "base/path", - }, - { - description: "should handle segments with only double slash", - base: "base", - segments: ["//", "path"], - expected: "base/path", - }, - { - description: "should handle base paths with trailing slashes", - base: "base/", - segments: ["path"], - expected: "base/path", - }, - { - description: "should handle complex nested paths", - base: "api/v1/", - segments: ["/users/", "/123/", "/profile"], - expected: "api/v1/users/123/profile", - }, - ]; - - edgeCaseTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("real-world scenarios", () => { - const realWorldTests: TestCase[] = [ - { - description: "should handle API endpoint construction", - base: "https://api.example.com/v1", - segments: ["users", "123", "posts"], - expected: "https://api.example.com/v1/users/123/posts", - }, - { - description: "should handle file path construction", - base: "/var/www", - segments: ["html", "assets", "images"], - expected: "/var/www/html/assets/images", - }, - { - description: "should handle relative path construction", - base: "../parent", - segments: ["child", "grandchild"], - expected: "../parent/child/grandchild", - }, - { - description: "should handle Windows-style paths", - base: "C:\\Users", - segments: ["Documents", "file.txt"], - expected: "C:\\Users/Documents/file.txt", - }, - ]; - - realWorldTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("performance scenarios", () => { - it("should handle many segments efficiently", () => { - const segments = Array(100).fill("segment"); - const result = join("base", ...segments); - expect(result).toBe(`base/${segments.join("/")}`); - }); - - it("should handle long URLs", () => { - const longPath = "a".repeat(1000); - expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); - }); - }); - - describe("trailing slash preservation", () => { - const trailingSlashTests: TestCase[] = [ - { - description: - "should preserve trailing slash on final result when base has trailing slash and no segments", - base: "https://api.example.com/", - segments: [], - expected: "https://api.example.com/", - }, - { - description: "should preserve trailing slash on v1 path", - base: "https://api.example.com/v1/", - segments: [], - expected: "https://api.example.com/v1/", - }, - { - description: "should preserve trailing slash when last segment has trailing slash", - base: "https://api.example.com", - segments: ["users/"], - expected: "https://api.example.com/users/", - }, - { - description: "should preserve trailing slash with relative path", - base: "api/v1", - segments: ["users/"], - expected: "api/v1/users/", - }, - { - description: "should preserve trailing slash with multiple segments", - base: "https://api.example.com", - segments: ["v1", "collections/"], - expected: "https://api.example.com/v1/collections/", - }, - { - description: "should preserve trailing slash with base path", - base: "base", - segments: ["path1", "path2/"], - expected: "base/path1/path2/", - }, - ]; - - trailingSlashTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts deleted file mode 100644 index 42cdffb9e5ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { toQueryString } from "../../../src/core/url/index"; - -describe("Test qs toQueryString", () => { - interface BasicTestCase { - description: string; - input: any; - expected: string; - } - - describe("Basic functionality", () => { - const basicTests: BasicTestCase[] = [ - { description: "should return empty string for null", input: null, expected: "" }, - { description: "should return empty string for undefined", input: undefined, expected: "" }, - { description: "should return empty string for string primitive", input: "hello", expected: "" }, - { description: "should return empty string for number primitive", input: 42, expected: "" }, - { description: "should return empty string for true boolean", input: true, expected: "" }, - { description: "should return empty string for false boolean", input: false, expected: "" }, - { description: "should handle empty objects", input: {}, expected: "" }, - { - description: "should handle simple key-value pairs", - input: { name: "John", age: 30 }, - expected: "name=John&age=30", - }, - ]; - - basicTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Array handling", () => { - interface ArrayTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const arrayTests: ArrayTestCase[] = [ - { - description: "should handle arrays with indices format (default)", - input: { items: ["a", "b", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", - }, - { - description: "should handle arrays with repeat format", - input: { items: ["a", "b", "c"] }, - options: { arrayFormat: "repeat" }, - expected: "items=a&items=b&items=c", - }, - { - description: "should handle empty arrays", - input: { items: [] }, - expected: "", - }, - { - description: "should handle arrays with mixed types", - input: { mixed: ["string", 42, true, false] }, - expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", - }, - { - description: "should handle arrays with objects", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", - }, - { - description: "should handle arrays with objects in repeat format", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - options: { arrayFormat: "repeat" }, - expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", - }, - ]; - - arrayTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Nested objects", () => { - const nestedTests: BasicTestCase[] = [ - { - description: "should handle nested objects", - input: { user: { name: "John", age: 30 } }, - expected: "user%5Bname%5D=John&user%5Bage%5D=30", - }, - { - description: "should handle deeply nested objects", - input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, - expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle empty nested objects", - input: { user: {} }, - expected: "", - }, - ]; - - nestedTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Encoding", () => { - interface EncodingTestCase { - description: string; - input: any; - options?: { encode?: boolean }; - expected: string; - } - - const encodingTests: EncodingTestCase[] = [ - { - description: "should encode by default", - input: { name: "John Doe", email: "john@example.com" }, - expected: "name=John%20Doe&email=john%40example.com", - }, - { - description: "should not encode when encode is false", - input: { name: "John Doe", email: "john@example.com" }, - options: { encode: false }, - expected: "name=John Doe&email=john@example.com", - }, - { - description: "should encode special characters in keys", - input: { "user name": "John", "email[primary]": "john@example.com" }, - expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", - }, - { - description: "should not encode special characters in keys when encode is false", - input: { "user name": "John", "email[primary]": "john@example.com" }, - options: { encode: false }, - expected: "user name=John&email[primary]=john@example.com", - }, - ]; - - encodingTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Mixed scenarios", () => { - interface MixedTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const mixedTests: MixedTestCase[] = [ - { - description: "should handle complex nested structures", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle complex nested structures with repeat format", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - options: { arrayFormat: "repeat" }, - expected: - "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle arrays with null/undefined values", - input: { items: ["a", null, "c", undefined, "e"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", - }, - { - description: "should handle objects with null/undefined values", - input: { name: "John", age: null, email: undefined, active: true }, - expected: "name=John&age=&active=true", - }, - ]; - - mixedTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Edge cases", () => { - const edgeCaseTests: BasicTestCase[] = [ - { - description: "should handle numeric keys", - input: { "0": "zero", "1": "one" }, - expected: "0=zero&1=one", - }, - { - description: "should handle boolean values in objects", - input: { enabled: true, disabled: false }, - expected: "enabled=true&disabled=false", - }, - { - description: "should handle empty strings", - input: { name: "", description: "test" }, - expected: "name=&description=test", - }, - { - description: "should handle zero values", - input: { count: 0, price: 0.0 }, - expected: "count=0&price=0", - }, - { - description: "should handle arrays with empty strings", - input: { items: ["a", "", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", - }, - ]; - - edgeCaseTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Options combinations", () => { - interface OptionsTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; - expected: string; - } - - const optionsTests: OptionsTestCase[] = [ - { - description: "should respect both arrayFormat and encode options", - input: { items: ["a & b", "c & d"] }, - options: { arrayFormat: "repeat", encode: false }, - expected: "items=a & b&items=c & d", - }, - { - description: "should use default options when none provided", - input: { items: ["a", "b"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b", - }, - { - description: "should merge provided options with defaults", - input: { items: ["a", "b"], name: "John Doe" }, - options: { encode: false }, - expected: "items[0]=a&items[1]=b&name=John Doe", - }, - ]; - - optionsTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts deleted file mode 100644 index 5a3250cc64ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContainerClient", () => { - test("getAndReturnListOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string", "string"]; - const rawResponseBody = ["string", "string"]; - server - .mockEndpoint() - .post("/container/list-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - expect(response).toEqual(["string", "string"]); - }); - - test("getAndReturnListOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }, { string: "string" }]; - const rawResponseBody = [{ string: "string" }, { string: "string" }]; - server - .mockEndpoint() - .post("/container/list-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfObjects([ - { - string: "string", - }, - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - { - string: "string", - }, - ]); - }); - - test("getAndReturnSetOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string"]; - const rawResponseBody = ["string"]; - server - .mockEndpoint() - .post("/container/set-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); - expect(response).toEqual(["string"]); - }); - - test("getAndReturnSetOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }]; - const rawResponseBody = [{ string: "string" }]; - server - .mockEndpoint() - .post("/container/set-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfObjects([ - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - ]); - }); - - test("getAndReturnMapPrimToPrim", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/map-prim-to-prim") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnMapOfPrimToObject", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: { string: "string" } }; - const rawResponseBody = { string: { string: "string" } }; - server - .mockEndpoint() - .post("/container/map-prim-to-object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ - string: { - string: "string", - }, - }); - expect(response).toEqual({ - string: { - string: "string", - }, - }); - }); - - test("getAndReturnOptional", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/opt-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnOptional({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts deleted file mode 100644 index f6336d860bd7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContentTypeClient", () => { - test("postJsonPatchContentType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); - - test("postJsonPatchContentWithCharsetType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts deleted file mode 100644 index 5770be42a097..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("EnumClient", () => { - test("getAndReturnEnum", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SUNNY"; - const rawResponseBody = "SUNNY"; - server - .mockEndpoint() - .post("/enum") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); - expect(response).toEqual("SUNNY"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts deleted file mode 100644 index aab4d5b86ec7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts +++ /dev/null @@ -1,212 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("HttpMethodsClient", () => { - test("testGet", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.httpMethods.testGet("id"); - expect(response).toEqual("string"); - }); - - test("testPost", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/http-methods") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPost({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPut", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .put("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPut("id", { - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPatch", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .patch("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testDelete", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = true; - server - .mockEndpoint() - .delete("/http-methods/id") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testDelete("id"); - expect(response).toEqual(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts deleted file mode 100644 index 8169463c8368..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts +++ /dev/null @@ -1,448 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ObjectClient", () => { - test("getAndReturnWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/object/get-and-return-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("getAndReturnWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/object/get-and-return-with-required-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnWithMapOfMap", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { map: { map: { map: "map" } } }; - const rawResponseBody = { map: { map: { map: "map" } } }; - server - .mockEndpoint() - .post("/object/get-and-return-with-map-of-map") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - map: { - map: "map", - }, - }, - }); - expect(response).toEqual({ - map: { - map: { - map: "map", - }, - }, - }); - }); - - test("getAndReturnNestedWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredFieldAsList", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - ]; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field-list") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - ]); - expect(response).toEqual({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts deleted file mode 100644 index be2e7ddd6591..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ParamsClient", () => { - test("getWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithPath("param"); - expect(response).toEqual("string"); - }); - - test("getWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithInlinePath({ - param: "param", - }); - expect(response).toEqual("string"); - }); - - test("getWithQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithAllowMultipleQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithPathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithPathAndQuery("param", { - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("getWithInlinePathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("modifyWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithPath("param", "string"); - expect(response).toEqual("string"); - }); - - test("modifyWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string", - }); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts deleted file mode 100644 index 7797a100db7b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PrimitiveClient", () => { - test("getAndReturnString", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .post("/primitive/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnString("string"); - expect(response).toEqual("string"); - }); - - test("getAndReturnInt", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1; - const rawResponseBody = 1; - server - .mockEndpoint() - .post("/primitive/integer") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnInt(1); - expect(response).toEqual(1); - }); - - test("getAndReturnLong", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1000000; - const rawResponseBody = 1000000; - server - .mockEndpoint() - .post("/primitive/long") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnLong(1000000); - expect(response).toEqual(1000000); - }); - - test("getAndReturnDouble", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1.1; - const rawResponseBody = 1.1; - server - .mockEndpoint() - .post("/primitive/double") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDouble(1.1); - expect(response).toEqual(1.1); - }); - - test("getAndReturnBool", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = true; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/primitive/boolean") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBool(true); - expect(response).toEqual(true); - }); - - test("getAndReturnDatetime", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2024-01-15T09:30:00Z"; - const rawResponseBody = "2024-01-15T09:30:00Z"; - server - .mockEndpoint() - .post("/primitive/datetime") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); - expect(response).toEqual("2024-01-15T09:30:00Z"); - }); - - test("getAndReturnDate", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2023-01-15"; - const rawResponseBody = "2023-01-15"; - server - .mockEndpoint() - .post("/primitive/date") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - expect(response).toEqual("2023-01-15"); - }); - - test("getAndReturnUUID", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - server - .mockEndpoint() - .post("/primitive/uuid") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - }); - - test("getAndReturnBase64", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SGVsbG8gd29ybGQh"; - const rawResponseBody = "SGVsbG8gd29ybGQh"; - server - .mockEndpoint() - .post("/primitive/base64") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - expect(response).toEqual("SGVsbG8gd29ybGQh"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts deleted file mode 100644 index 1481521d77b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PutClient", () => { - test("add", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - errors: [ - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - ], - }; - server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.put.add({ - id: "id", - }); - expect(response).toEqual({ - errors: [ - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - ], - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts deleted file mode 100644 index 35b1405e89ca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UnionClient", () => { - test("getAndReturnUnion", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; - const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; - server - .mockEndpoint() - .post("/union") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - expect(response).toEqual({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts deleted file mode 100644 index b450fbeea217..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UrlsClient", () => { - test("withMixedCase", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.urls.withMixedCase(); - expect(response).toEqual("string"); - }); - - test("noEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/no-ending-slash") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.noEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with-ending-slash/") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withUnderscores", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with_underscores") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withUnderscores(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts deleted file mode 100644 index 74529a1788fd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts +++ /dev/null @@ -1,150 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("InlinedRequestsClient", () => { - test("postWithObjectBodyandResponse (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithObjectBodyandResponse (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts deleted file mode 100644 index 3317cf1a69d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoAuthClient", () => { - test("postWithNoAuth (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.noAuth.postWithNoAuth({ - key: "value", - }); - expect(response).toEqual(true); - }); - - test("postWithNoAuth (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.noAuth.postWithNoAuth({ - key: "value", - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts deleted file mode 100644 index 7aec8c7699f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoReqBodyClient", () => { - test("getWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.getWithNoRequestBody(); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.postWithNoRequestBody(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts deleted file mode 100644 index a2295047e422..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("ReqWithHeadersClient", () => { - test("getWithCustomHeader", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - - server - .mockEndpoint() - .post("/test-headers/custom-header") - .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") - .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .build(); - - const response = await client.reqWithHeaders.getWithCustomHeader({ - "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - body: "string", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json deleted file mode 100644 index d7627675de20..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "extendedDiagnostics": true, - "strict": true, - "target": "ES6", - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "dist", - "rootDir": "src", - "baseUrl": "src", - "isolatedModules": true, - "isolatedDeclarations": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json deleted file mode 100644 index 5c11446f5984..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "dist/cjs" - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json deleted file mode 100644 index 6ce909748b2c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "esnext", - "outDir": "dist/esm", - "verbatimModuleSyntax": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json deleted file mode 100644 index d77fdf00d259..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.cjs.json" -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts deleted file mode 100644 index ba2ec4f9d45a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from "vitest/config"; -export default defineConfig({ - test: { - projects: [ - { - test: { - globals: true, - name: "unit", - environment: "node", - root: "./tests", - include: ["**/*.test.{js,ts,jsx,tsx}"], - exclude: ["wire/**"], - setupFiles: ["./setup.ts"], - }, - }, - { - test: { - globals: true, - name: "wire", - environment: "node", - root: "./tests/wire", - setupFiles: ["../setup.ts", "../mock-server/setup.ts"], - }, - }, - ], - passWithNoTests: true, - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json deleted file mode 100644 index 4a881bff00a8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "cliVersion": "DUMMY", - "generatorName": "fernapi/fern-typescript-sdk", - "generatorVersion": "latest", - "generatorConfig": { - "serializationFormat": "zod" - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml deleted file mode 100644 index 836106996595..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: ci - -on: [push] - -jobs: - compile: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Compile - run: pnpm build - - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Test - run: pnpm test - - publish: - needs: [ compile, test ] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build - run: pnpm build - - - name: Publish to npm - run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - publish() { # use latest npm to ensure OIDC support - npx -y npm@latest publish "$@" - } - if [[ ${GITHUB_REF} == *alpha* ]]; then - publish --access public --tag alpha - elif [[ ${GITHUB_REF} == *beta* ]]; then - publish --access public --tag beta - else - publish --access public - fi - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore deleted file mode 100644 index 72271e049c02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.DS_Store -/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md deleted file mode 100644 index fe5bc2f77e0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md +++ /dev/null @@ -1,133 +0,0 @@ -# Contributing - -Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. - -## Getting Started - -### Prerequisites - -- Node.js 20 or higher -- pnpm package manager - -### Installation - -Install the project dependencies: - -```bash -pnpm install -``` - -### Building - -Build the project: - -```bash -pnpm build -``` - -### Testing - -Run the test suite: - -```bash -pnpm test -``` - -Run specific test types: -- `pnpm test:unit` - Run unit tests -- `pnpm test:wire` - Run wire/integration tests - -### Linting and Formatting - -Check code style: - -```bash -pnpm run lint -pnpm run format:check -``` - -Fix code style issues: - -```bash -pnpm run lint:fix -pnpm run format:fix -``` - -Or use the combined check command: - -```bash -pnpm run check:fix -``` - -## About Generated Code - -**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. - -### Generated Files - -The following directories contain generated code: -- `src/api/` - API client classes and types -- `src/serialization/` - Serialization/deserialization logic -- Most TypeScript files in `src/` - -### How to Customize - -If you need to customize the SDK, you have two options: - -#### Option 1: Use `.fernignore` - -For custom code that should persist across SDK regenerations: - -1. Create a `.fernignore` file in the project root -2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) -3. Add your custom code to those files - -Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. - -For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). - -#### Option 2: Contribute to the Generator - -If you want to change how code is generated for all users of this SDK: - -1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) -2. Generator code is located at `generators/typescript/sdk/` -3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) -4. Submit a pull request with your changes to the generator - -This approach is best for: -- Bug fixes in generated code -- New features that would benefit all users -- Improvements to code generation patterns - -## Making Changes - -### Workflow - -1. Create a new branch for your changes -2. Make your modifications -3. Run tests to ensure nothing breaks: `pnpm test` -4. Run linting and formatting: `pnpm run check:fix` -5. Build the project: `pnpm build` -6. Commit your changes with a clear commit message -7. Push your branch and create a pull request - -### Commit Messages - -Write clear, descriptive commit messages that explain what changed and why. - -### Code Style - -This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. - -## Questions or Issues? - -If you have questions or run into issues: - -1. Check the [Fern documentation](https://buildwithfern.com) -2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) -3. Open a new issue if your question hasn't been addressed - -## License - -By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/README.md b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md deleted file mode 100644 index 140b1fb505f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/README.md +++ /dev/null @@ -1,241 +0,0 @@ -# Seed TypeScript Library - -[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) -[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) - -The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. - -## Installation - -```sh -npm i -s @fern/exhaustive -``` - -## Reference - -A full reference for this library is available [here](./reference.md). - -## Usage - -Instantiate and use the client with the following: - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); -``` - -## Request And Response Types - -The SDK exports all request and response types as TypeScript interfaces. Simply import them with the -following namespace: - -```typescript -import { SeedExhaustive } from "@fern/exhaustive"; - -const request: SeedExhaustive.GetWithInlinePath = { - ... -}; -``` - -## Exception Handling - -When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error -will be thrown. - -```typescript -import { SeedExhaustiveError } from "@fern/exhaustive"; - -try { - await client.endpoints.container.getAndReturnListOfPrimitives(...); -} catch (err) { - if (err instanceof SeedExhaustiveError) { - console.log(err.statusCode); - console.log(err.message); - console.log(err.body); - console.log(err.rawResponse); - } -} -``` - -## Advanced - -### Additional Headers - -If you would like to send additional headers as part of the request, use the `headers` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - headers: { - 'X-Custom-Header': 'custom value' - } -}); -``` - -### Additional Query String Parameters - -If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - queryParams: { - 'customQueryParamKey': 'custom query param value' - } -}); -``` - -### Retries - -The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long -as the request is deemed retryable and the number of retry attempts has not grown larger than the configured -retry limit (default: 2). - -A request is deemed retryable when any of the following HTTP status codes is returned: - -- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) -- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) -- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) - -Use the `maxRetries` request option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - maxRetries: 0 // override maxRetries at the request level -}); -``` - -### Timeouts - -The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - timeoutInSeconds: 30 // override timeout to 30s -}); -``` - -### Aborting Requests - -The SDK allows users to abort requests at any point by passing in an abort signal. - -```typescript -const controller = new AbortController(); -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - abortSignal: controller.signal -}); -controller.abort(); // aborts the request -``` - -### Access Raw Response Data - -The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. -The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. - -```typescript -const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); - -console.log(data); -console.log(rawResponse.headers['X-My-Header']); -``` - -### Logging - -The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. - -```typescript -import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - logging: { - level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info - logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger - silent: false, // defaults to true, set to false to enable logging - } -}); -``` -The `logging` object can have the following properties: -- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. -- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. -- `silent`: Whether to silence the logger. Defaults to `true`. - -The `level` property can be one of the following values: -- `logging.LogLevel.Debug` -- `logging.LogLevel.Info` -- `logging.LogLevel.Warn` -- `logging.LogLevel.Error` - -To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. - -
-Custom logger examples - -Here's an example using the popular `winston` logging library. -```ts -import winston from 'winston'; - -const winstonLogger = winston.createLogger({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => winstonLogger.debug(msg, ...args), - info: (msg, ...args) => winstonLogger.info(msg, ...args), - warn: (msg, ...args) => winstonLogger.warn(msg, ...args), - error: (msg, ...args) => winstonLogger.error(msg, ...args), -}; -``` - -Here's an example using the popular `pino` logging library. - -```ts -import pino from 'pino'; - -const pinoLogger = pino({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => pinoLogger.debug(args, msg), - info: (msg, ...args) => pinoLogger.info(args, msg), - warn: (msg, ...args) => pinoLogger.warn(args, msg), - error: (msg, ...args) => pinoLogger.error(args, msg), -}; -``` -
- - -### Runtime Compatibility - - -The SDK works in the following runtimes: - - - -- Node.js 18+ -- Vercel -- Cloudflare Workers -- Deno v1.25+ -- Bun 1.0+ -- React Native - -### Customizing Fetch Client - -The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an -unsupported environment, this provides a way for you to break glass and ensure the SDK works. - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - fetcher: // provide your implementation here -}); -``` - -## Contributing - -While we value open-source contributions to this SDK, this library is generated programmatically. -Additions made directly to this library would have to be moved over to our generation code, -otherwise they would be overwritten upon the next generated release. Feel free to open a PR as -a proof of concept, but know that we will not be able to merge it as-is. We suggest opening -an issue first to discuss with us! - -On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json deleted file mode 100644 index a777468e4ae2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", - "root": true, - "vcs": { - "enabled": false - }, - "files": { - "ignoreUnknown": true, - "includes": [ - "**", - "!!dist", - "!!**/dist", - "!!lib", - "!!**/lib", - "!!_tmp_*", - "!!**/_tmp_*", - "!!*.tmp", - "!!**/*.tmp", - "!!.tmp/", - "!!**/.tmp/", - "!!*.log", - "!!**/*.log", - "!!**/.DS_Store", - "!!**/Thumbs.db" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 4, - "lineWidth": 120 - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - }, - "linter": { - "rules": { - "style": { - "useNodejsImportProtocol": "off" - }, - "suspicious": { - "noAssignInExpressions": "warn", - "noUselessEscapeInString": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noThenProperty": "warn", - "useIterableCallbackReturn": "warn", - "noShadowRestrictedNames": "warn", - "noTsIgnore": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noConfusingVoidType": { - "level": "warn", - "fix": "none", - "options": {} - } - } - } - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/package.json b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json deleted file mode 100644 index 20397bfc4323..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "@fern/exhaustive", - "version": "0.0.1", - "private": false, - "repository": "github:exhaustive/fern", - "type": "commonjs", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.mjs", - "types": "./dist/cjs/index.d.ts", - "exports": { - ".": { - "types": "./dist/cjs/index.d.ts", - "import": { - "types": "./dist/esm/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - }, - "default": "./dist/cjs/index.js" - }, - "./serialization": { - "types": "./dist/cjs/serialization/index.d.ts", - "import": { - "types": "./dist/esm/serialization/index.d.mts", - "default": "./dist/esm/serialization/index.mjs" - }, - "require": { - "types": "./dist/cjs/serialization/index.d.ts", - "default": "./dist/cjs/serialization/index.js" - }, - "default": "./dist/cjs/serialization/index.js" - }, - "./package.json": "./package.json" - }, - "files": [ - "dist", - "reference.md", - "README.md", - "LICENSE" - ], - "scripts": { - "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "build": "pnpm build:cjs && pnpm build:esm", - "build:cjs": "tsc --project ./tsconfig.cjs.json", - "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", - "test": "vitest", - "test:unit": "vitest --project unit", - "test:wire": "vitest --project wire" - }, - "dependencies": { - "zod": "^3.23.0" - }, - "devDependencies": { - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", - "vitest": "^3.2.4", - "msw": "2.11.2", - "@types/node": "^18.19.70", - "typescript": "~5.7.2", - "@biomejs/biome": "2.3.1" - }, - "browser": { - "fs": false, - "os": false, - "path": false, - "stream": false - }, - "packageManager": "pnpm@10.20.0", - "engines": { - "node": ">=18.0.0" - }, - "sideEffects": false -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml deleted file mode 100644 index 6e4c395107df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml +++ /dev/null @@ -1 +0,0 @@ -packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md deleted file mode 100644 index b571afcab9fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md +++ /dev/null @@ -1,2761 +0,0 @@ -# Reference -## Endpoints Container -
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfObjects([{ - string: "string" - }, { - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Set` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfObjects([{ - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapPrimToPrim({ - "string": "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapOfPrimToObject({ - "string": { - string: "string" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnOptional({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints ContentType -
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Enum -
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.enum.getAndReturnEnum("SUNNY"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.WeatherReport` - -
-
- -
-
- -**requestOptions:** `EnumClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints HttpMethods -
client.endpoints.httpMethods.testGet(id) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testGet("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPost({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPut("id", { - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testDelete(id) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testDelete("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Object -
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - "map": { - "map": "map" - } - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithMapOfMap` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**string:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }, { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Params -
client.endpoints.params.getWithPath(param) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPath("param"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePath({ - param: "param" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with multiple of same query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPathAndQuery("param", { - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithPath(param, { ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithPath("param", "string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Primitive -
client.endpoints.primitive.getAndReturnString({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnString("string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnInt(1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnLong(1000000); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDouble(1.1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBool(true); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `boolean` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Date` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Put -
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.put.add({ - id: "id" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.PutRequest` - -
-
- -
-
- -**requestOptions:** `PutClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Union -
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.Animal` - -
-
- -
-
- -**requestOptions:** `UnionClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Urls -
client.endpoints.urls.withMixedCase() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withMixedCase(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.noEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.noEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withUnderscores() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withUnderscores(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## InlinedRequests -
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 📝 Description - -
-
- -
-
- -POST with custom object in request body, response is an object -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.PostWithObjectBody` - -
-
- -
-
- -**requestOptions:** `InlinedRequestsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoAuth -
client.noAuth.postWithNoAuth({ ...params }) -> boolean -
-
- -#### 📝 Description - -
-
- -
-
- -POST request with no auth -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noAuth.postWithNoAuth({ - "key": "value" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `unknown` - -
-
- -
-
- -**requestOptions:** `NoAuthClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoReqBody -
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.getWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.noReqBody.postWithNoRequestBody() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.postWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## ReqWithHeaders -
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ReqWithHeaders` - -
-
- -
-
- -**requestOptions:** `ReqWithHeadersClient.RequestOptions` - -
-
-
-
- - -
-
-
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js deleted file mode 100644 index dc1df1cbbacb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs").promises; -const path = require("path"); - -const extensionMap = { - ".js": ".mjs", - ".d.ts": ".d.mts", -}; -const oldExtensions = Object.keys(extensionMap); - -async function findFiles(rootPath) { - const files = []; - - async function scan(directory) { - const entries = await fs.readdir(directory, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(directory, entry.name); - - if (entry.isDirectory()) { - if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { - await scan(fullPath); - } - } else if (entry.isFile()) { - if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { - files.push(fullPath); - } - } - } - } - - await scan(rootPath); - return files; -} - -async function updateFiles(files) { - const updatedFiles = []; - for (const file of files) { - const updated = await updateFileContents(file); - updatedFiles.push(updated); - } - - console.log(`Updated imports in ${updatedFiles.length} files.`); -} - -async function updateFileContents(file) { - const content = await fs.readFile(file, "utf8"); - - let newContent = content; - // Update each extension type defined in the map - for (const [oldExt, newExt] of Object.entries(extensionMap)) { - // Handle static imports/exports - const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); - newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); - - // Handle dynamic imports (yield import, await import, regular import()) - const dynamicRegex = new RegExp( - `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, - "g", - ); - newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); - } - - if (content !== newContent) { - await fs.writeFile(file, newContent, "utf8"); - return true; - } - return false; -} - -async function renameFiles(files) { - let counter = 0; - for (const file of files) { - const ext = oldExtensions.find((ext) => file.endsWith(ext)); - const newExt = extensionMap[ext]; - - if (newExt) { - const newPath = file.slice(0, -ext.length) + newExt; - await fs.rename(file, newPath); - counter++; - } - } - - console.log(`Renamed ${counter} files.`); -} - -async function main() { - try { - const targetDir = process.argv[2]; - if (!targetDir) { - console.error("Please provide a target directory"); - process.exit(1); - } - - const targetPath = path.resolve(targetDir); - const targetStats = await fs.stat(targetPath); - - if (!targetStats.isDirectory()) { - console.error("The provided path is not a directory"); - process.exit(1); - } - - console.log(`Scanning directory: ${targetDir}`); - - const files = await findFiles(targetDir); - - if (files.length === 0) { - console.log("No matching files found."); - process.exit(0); - } - - console.log(`Found ${files.length} files.`); - await updateFiles(files); - await renameFiles(files); - console.log("\nDone!"); - } catch (error) { - console.error("An error occurred:", error.message); - process.exit(1); - } -} - -main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json deleted file mode 100644 index 875b76c4bb57..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "endpoints": [ - { - "id": { - "path": "/container/list-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" - } - }, - { - "id": { - "path": "/container/list-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/set-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" - } - }, - { - "id": { - "path": "/container/set-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-prim", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-object", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" - } - }, - { - "id": { - "path": "/container/opt-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/foo/bar", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/foo/baz", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/enum", - "method": "POST", - "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "GET", - "identifier_override": "endpoint_endpoints/http-methods.testGet" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" - } - }, - { - "id": { - "path": "/http-methods", - "method": "POST", - "identifier_override": "endpoint_endpoints/http-methods.testPost" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/http-methods.testPut" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PATCH", - "identifier_override": "endpoint_endpoints/http-methods.testPatch" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "DELETE", - "identifier_override": "endpoint_endpoints/http-methods.testDelete" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-required-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-map-of-map", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field/{string}", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field-list", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/primitive/string", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" - } - }, - { - "id": { - "path": "/primitive/integer", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" - } - }, - { - "id": { - "path": "/primitive/long", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" - } - }, - { - "id": { - "path": "/primitive/double", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" - } - }, - { - "id": { - "path": "/primitive/boolean", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" - } - }, - { - "id": { - "path": "/primitive/datetime", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" - } - }, - { - "id": { - "path": "/primitive/date", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" - } - }, - { - "id": { - "path": "/primitive/uuid", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" - } - }, - { - "id": { - "path": "/primitive/base64", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" - } - }, - { - "id": { - "path": "/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/put.add" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" - } - }, - { - "id": { - "path": "/union", - "method": "POST", - "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" - } - }, - { - "id": { - "path": "/urls/MixedCase", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withMixedCase" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" - } - }, - { - "id": { - "path": "/urls/no-ending-slash", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.noEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with-ending-slash/", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with_underscores", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withUnderscores" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" - } - }, - { - "id": { - "path": "/req-bodies/object", - "method": "POST", - "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/no-auth", - "method": "POST", - "identifier_override": "endpoint_no-auth.postWithNoAuth" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "GET", - "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "POST", - "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/test-headers/custom-header", - "method": "POST", - "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" - } - } - ], - "types": {} -} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts deleted file mode 100644 index f28de2b4c43c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts +++ /dev/null @@ -1,82 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; -import { mergeHeaders } from "./core/headers.js"; -import * as core from "./core/index.js"; - -export interface BaseClientOptions { - environment: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token?: core.Supplier; - /** Additional headers to include in requests. */ - headers?: Record | null | undefined>; - /** The default maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The default number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ - fetch?: typeof fetch; - /** Configure logging for the client. */ - logging?: core.logging.LogConfig | core.logging.Logger; -} - -export interface BaseRequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Additional query string parameters to include in the request. */ - queryParams?: Record; - /** Additional headers to include in the request. */ - headers?: Record | null | undefined>; -} - -export type NormalizedClientOptions = T & { - logging: core.logging.Logger; - authProvider?: core.AuthProvider; -}; - -export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { - authProvider: core.AuthProvider; -}; - -export function normalizeClientOptions(options: T): NormalizedClientOptions { - const headers = mergeHeaders( - { - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "@fern/exhaustive", - "X-Fern-SDK-Version": "0.0.1", - "User-Agent": "@fern/exhaustive/0.0.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - }, - options?.headers, - ); - - return { - ...options, - logging: core.logging.createLogger(options?.logging), - headers, - } as NormalizedClientOptions; -} - -export function normalizeClientOptionsWithAuth( - options: T, -): NormalizedClientOptionsWithAuth { - const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; - const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); - normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); - return normalized; -} - -function withNoOpAuthProvider( - options: NormalizedClientOptions, -): NormalizedClientOptionsWithAuth { - return { - ...options, - authProvider: new core.NoOpAuthProvider(), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts deleted file mode 100644 index d5ca904d9544..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; -import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; -import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; -import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; -import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; -import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; - -export declare namespace SeedExhaustiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class SeedExhaustiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _endpoints: EndpointsClient | undefined; - protected _inlinedRequests: InlinedRequestsClient | undefined; - protected _noAuth: NoAuthClient | undefined; - protected _noReqBody: NoReqBodyClient | undefined; - protected _reqWithHeaders: ReqWithHeadersClient | undefined; - - constructor(options: SeedExhaustiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get endpoints(): EndpointsClient { - return (this._endpoints ??= new EndpointsClient(this._options)); - } - - public get inlinedRequests(): InlinedRequestsClient { - return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); - } - - public get noAuth(): NoAuthClient { - return (this._noAuth ??= new NoAuthClient(this._options)); - } - - public get noReqBody(): NoReqBodyClient { - return (this._noReqBody ??= new NoReqBodyClient(this._options)); - } - - public get reqWithHeaders(): ReqWithHeadersClient { - return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts deleted file mode 100644 index b124def3d861..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts +++ /dev/null @@ -1,76 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { ContainerClient } from "../resources/container/client/Client.js"; -import { ContentTypeClient } from "../resources/contentType/client/Client.js"; -import { EnumClient } from "../resources/enum/client/Client.js"; -import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; -import { ObjectClient } from "../resources/object/client/Client.js"; -import { ParamsClient } from "../resources/params/client/Client.js"; -import { PrimitiveClient } from "../resources/primitive/client/Client.js"; -import { PutClient } from "../resources/put/client/Client.js"; -import { UnionClient } from "../resources/union/client/Client.js"; -import { UrlsClient } from "../resources/urls/client/Client.js"; - -export declare namespace EndpointsClient { - export interface Options extends BaseClientOptions {} -} - -export class EndpointsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _container: ContainerClient | undefined; - protected _contentType: ContentTypeClient | undefined; - protected _enum: EnumClient | undefined; - protected _httpMethods: HttpMethodsClient | undefined; - protected _object: ObjectClient | undefined; - protected _params: ParamsClient | undefined; - protected _primitive: PrimitiveClient | undefined; - protected _put: PutClient | undefined; - protected _union: UnionClient | undefined; - protected _urls: UrlsClient | undefined; - - constructor(options: EndpointsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get container(): ContainerClient { - return (this._container ??= new ContainerClient(this._options)); - } - - public get contentType(): ContentTypeClient { - return (this._contentType ??= new ContentTypeClient(this._options)); - } - - public get enum(): EnumClient { - return (this._enum ??= new EnumClient(this._options)); - } - - public get httpMethods(): HttpMethodsClient { - return (this._httpMethods ??= new HttpMethodsClient(this._options)); - } - - public get object(): ObjectClient { - return (this._object ??= new ObjectClient(this._options)); - } - - public get params(): ParamsClient { - return (this._params ??= new ParamsClient(this._options)); - } - - public get primitive(): PrimitiveClient { - return (this._primitive ??= new PrimitiveClient(this._options)); - } - - public get put(): PutClient { - return (this._put ??= new PutClient(this._options)); - } - - public get union(): UnionClient { - return (this._union ??= new UnionClient(this._options)); - } - - public get urls(): UrlsClient { - return (this._urls ??= new UrlsClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts deleted file mode 100644 index 9eb1192dcc32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts deleted file mode 100644 index 65bf08dc772d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts +++ /dev/null @@ -1,477 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContainerClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContainerClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContainerClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) - */ - public getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response._schema.parse( - _response.body, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/list-of-primitives", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfObjects([{ - * string: "string" - * }, { - * string: "string" - * }]) - */ - public getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); - } - - private async __getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfObjects.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfObjects.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); - } - - /** - * @param {Set} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) - */ - public getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response._schema.parse( - _response.body, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfObjects([{ - * string: "string" - * }]) - */ - public getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); - } - - private async __getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfObjects.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapPrimToPrim({ - * "string": "string" - * }) - */ - public getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); - } - - private async __getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-prim", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapOfPrimToObject({ - * "string": { - * string: "string" - * } - * }) - */ - public getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); - } - - private async __getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response._schema.parse( - _response.body, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/map-prim-to-object", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnOptional({ - * string: "string" - * }) - */ - public getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); - } - - private async __getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/opt-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: - request != null - ? serializers.endpoints.container.getAndReturnOptional.Request.json(request) - : undefined, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnOptional.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts deleted file mode 100644 index 920acc7a8a7e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts +++ /dev/null @@ -1,172 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContentTypeClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContentTypeClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContentTypeClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); - } - - private async __postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/bar", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__postJsonPatchContentWithCharsetType(request, requestOptions), - ); - } - - private async __postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/baz", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json; charset=utf-8", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts deleted file mode 100644 index befd4eb2fe7b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts +++ /dev/null @@ -1,84 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace EnumClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class EnumClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: EnumClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.WeatherReport} request - * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.enum.getAndReturnEnum("SUNNY") - */ - public getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); - } - - private async __getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/enum", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.WeatherReport.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.WeatherReport._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts deleted file mode 100644 index 26cd0aef2380..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts +++ /dev/null @@ -1,341 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace HttpMethodsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class HttpMethodsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: HttpMethodsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testGet("id") - */ - public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); - } - - private async __testGet( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testGet.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPost({ - * string: "string" - * }) - */ - public testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); - } - - private async __testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/http-methods", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPut("id", { - * string: "string" - * }) - */ - public testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); - } - - private async __testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPatch("id", { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); - } - - private async __testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PATCH", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testDelete("id") - */ - public testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); - } - - private async __testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "DELETE", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testDelete.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts deleted file mode 100644 index 6046843b5e42..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * as container from "./container/index.js"; -export * as contentType from "./contentType/index.js"; -export * as enum_ from "./enum/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * from "./params/client/requests/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * from "./put/client/requests/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as union from "./union/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts deleted file mode 100644 index 977107bd4917..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts +++ /dev/null @@ -1,523 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ObjectClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ObjectClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ObjectClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithOptionalField({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); - } - - private async __getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-optional-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithRequiredField({ - * string: "string" - * }) - */ - public getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); - } - - private async __getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-required-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithRequiredField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-required-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithMapOfMap} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithMapOfMap({ - * map: { - * "map": { - * "map": "map" - * } - * } - * }) - */ - public getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); - } - - private async __getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-map-of-map", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithMapOfMap.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithMapOfMap._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-map-of-map", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithOptionalField({ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithOptionalField(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-optional-field", - ); - } - - /** - * @param {string} string - * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field/{string}", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }, { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }]) - */ - public getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-required-field-list", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field-list", - ); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts deleted file mode 100644 index 3a81c10c657f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts +++ /dev/null @@ -1,535 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ParamsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ParamsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ParamsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * GET with path param - * - * @param {string} param - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPath("param") - */ - public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); - } - - private async __getWithPath( - param: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithPath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with path param - * - * @param {SeedExhaustive.endpoints.GetWithInlinePath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePath({ - * param: "param" - * }) - */ - public getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); - } - - private async __getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithInlinePath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with query param - * - * @param {SeedExhaustive.endpoints.GetWithQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); - } - - private async __getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - _queryParams.number = number_.toString(); - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with multiple of same query param - * - * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithAllowMultipleQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); - } - - private async __getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - if (Array.isArray(query)) { - _queryParams.query = query.map((item) => item); - } else { - _queryParams.query = query; - } - - if (Array.isArray(number_)) { - _queryParams.number = number_.map((item) => item.toString()); - } else { - _queryParams.number = number_.toString(); - } - - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with path and query params - * - * @param {string} param - * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPathAndQuery("param", { - * query: "query" - * }) - */ - public getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); - } - - private async __getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * GET with path and query params - * - * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePathAndQuery({ - * param: "param", - * query: "query" - * }) - */ - public getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); - } - - private async __getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * PUT to update with path param - * - * @param {string} param - * @param {string} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithPath("param", "string") - */ - public modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); - } - - private async __modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithPath.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithPath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } - - /** - * PUT to update with path param - * - * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithInlinePath({ - * param: "param", - * body: "string" - * }) - */ - public modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); - } - - private async __modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithInlinePath.Request.json(_body), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithInlinePath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts deleted file mode 100644 index 473165eb1638..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param" - * } - */ -export interface GetWithInlinePath { - param: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts deleted file mode 100644 index 9c674a852dce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * query: "query" - * } - */ -export interface GetWithInlinePathAndQuery { - param: string; - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts deleted file mode 100644 index baca4fafbe62..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithMultipleQuery { - query: string | string[]; - number: number | number[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts deleted file mode 100644 index c3f0018a7874..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query" - * } - */ -export interface GetWithPathAndQuery { - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts deleted file mode 100644 index 7ad48dee4508..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithQuery { - query: string; - number: number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts deleted file mode 100644 index f3f91a06e3f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * body: "string" - * } - */ -export interface ModifyResourceAtInlinedPath { - param: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts deleted file mode 100644 index b059d3702a32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { GetWithInlinePath } from "./GetWithInlinePath.js"; -export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; -export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; -export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; -export type { GetWithQuery } from "./GetWithQuery.js"; -export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts deleted file mode 100644 index 60ef815dc211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts +++ /dev/null @@ -1,563 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace PrimitiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PrimitiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PrimitiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnString("string") - */ - public getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); - } - - private async __getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/string", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnString.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnString.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnInt(1) - */ - public getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); - } - - private async __getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/integer", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnInt.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnInt.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnLong(1000000) - */ - public getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); - } - - private async __getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/long", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnLong.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnLong.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDouble(1.1) - */ - public getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); - } - - private async __getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/double", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDouble.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDouble.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); - } - - /** - * @param {boolean} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBool(true) - */ - public getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); - } - - private async __getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/boolean", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBool.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBool.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); - } - - /** - * @param {Date} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) - */ - public getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); - } - - private async __getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/datetime", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDatetime.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDatetime.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDate("2023-01-15") - */ - public getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); - } - - private async __getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/date", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDate.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDate.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") - */ - public getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); - } - - private async __getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/uuid", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnUuid.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnUuid.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") - */ - public getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); - } - - private async __getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/base64", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBase64.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBase64.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts deleted file mode 100644 index 6a89a9bc090e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts +++ /dev/null @@ -1,84 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace PutClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PutClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PutClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.endpoints.PutRequest} request - * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.put.add({ - * id: "id" - * }) - */ - public add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); - } - - private async __add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): Promise> { - const { id } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.PutResponse._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts deleted file mode 100644 index 2beba9f087cc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * id: "id" - * } - */ -export interface PutRequest { - id: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts deleted file mode 100644 index dba0eda4bbee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts deleted file mode 100644 index d9adb1af9a93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index a197fec87887..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCategory = { - ApiError: "API_ERROR", - AuthenticationError: "AUTHENTICATION_ERROR", - InvalidRequestError: "INVALID_REQUEST_ERROR", -} as const; -export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 3943226222d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCode = { - InternalServerError: "INTERNAL_SERVER_ERROR", - Unauthorized: "UNAUTHORIZED", - Forbidden: "FORBIDDEN", - BadRequest: "BAD_REQUEST", - Conflict: "CONFLICT", - Gone: "GONE", - UnprocessableEntity: "UNPROCESSABLE_ENTITY", - NotImplemented: "NOT_IMPLEMENTED", - BadGateway: "BAD_GATEWAY", - ServiceUnavailable: "SERVICE_UNAVAILABLE", - Unknown: "Unknown", -} as const; -export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 9cf9f495a09a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface Error_ { - category: SeedExhaustive.endpoints.ErrorCategory; - code: SeedExhaustive.endpoints.ErrorCode; - detail?: string; - field?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 628b46ba7298..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface PutResponse { - errors?: SeedExhaustive.endpoints.Error_[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts deleted file mode 100644 index 95f732c131d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts +++ /dev/null @@ -1,85 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace UnionClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UnionClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UnionClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.Animal} request - * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.union.getAndReturnUnion({ - * animal: "dog", - * name: "name", - * likesToWoof: true - * }) - */ - public getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); - } - - private async __getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/union", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.Animal.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: serializers.types.Animal._schema.parse(_response.body), rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts deleted file mode 100644 index c9401e289700..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts +++ /dev/null @@ -1,223 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace UrlsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UrlsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UrlsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withMixedCase() - */ - public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); - } - - private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/MixedCase", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withMixedCase.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.noEndingSlash() - */ - public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); - } - - private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/no-ending-slash", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.noEndingSlash.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withEndingSlash() - */ - public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); - } - - private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with-ending-slash/", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withEndingSlash.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withUnderscores() - */ - public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); - } - - private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with_underscores", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withUnderscores.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts deleted file mode 100644 index 6c0020d2b75a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../core/index.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export class BadRequestBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { - super({ - message: "BadRequestBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts deleted file mode 100644 index 61778bda5417..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index 6ad426742488..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface BadObjectRequestInfo { - message: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts deleted file mode 100644 index 3ca611c9fb54..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * from "./generalErrors/errors/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * from "./reqWithHeaders/client/requests/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts deleted file mode 100644 index dcf128fe3b72..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts +++ /dev/null @@ -1,111 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace InlinedRequestsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class InlinedRequestsClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: InlinedRequestsClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST with custom object in request body, response is an object - * - * @param {SeedExhaustive.PostWithObjectBody} request - * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.inlinedRequests.postWithObjectBodyandResponse({ - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); - } - - private async __postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/req-bodies/object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.PostWithObjectBody.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo._schema.parse(_response.error.body), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index 15d3f75bc67d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../index.js"; - -/** - * @example - * { - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * } - */ -export interface PostWithObjectBody { - string: string; - integer: number; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index 104f84256770..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts deleted file mode 100644 index 282d68aa3b53..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoAuthClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoAuthClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: NoAuthClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST request with no auth - * - * @param {unknown} request - * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.noAuth.postWithNoAuth({ - * "key": "value" - * }) - */ - public postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); - } - - private async __postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-auth", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noAuth.postWithNoAuth.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo._schema.parse(_response.error.body), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts deleted file mode 100644 index 6eea09ec1f67..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts +++ /dev/null @@ -1,130 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoReqBodyClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoReqBodyClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: NoReqBodyClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.getWithNoRequestBody() - */ - public getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); - } - - private async __getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.postWithNoRequestBody() - */ - public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); - } - - private async __postWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "POST", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noReqBody.postWithNoRequestBody.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts deleted file mode 100644 index 5cf55b3b4c66..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts +++ /dev/null @@ -1,90 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace ReqWithHeadersClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ReqWithHeadersClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ReqWithHeadersClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.ReqWithHeaders} request - * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.reqWithHeaders.getWithCustomHeader({ - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * }) - */ - public getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); - } - - private async __getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): Promise> { - const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - mergeOnlyDefinedHeaders({ - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - }), - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/test-headers/custom-header", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.reqWithHeaders.getWithCustomHeader.Request.json(_body), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts deleted file mode 100644 index b7fce3790bf5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * } - */ -export interface ReqWithHeaders { - xTestServiceHeader: string; - xTestEndpointHeader: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts deleted file mode 100644 index 5419b56cd667..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index ed458c66ba3c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,66 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithDocs { - /** - * Characters that could lead to broken generated SDKs: - * - * Markdown Escapes: - * - \_: Escaped underscore (e.g., FOO\_BAR) - * - \*: Escaped asterisk - * - * JSDoc (JavaScript/TypeScript): - * - @: Used for JSDoc tags - * - {: }: Used for type definitions - * - <: >: HTML tags - * - *: Can interfere with comment blocks - * - /**: JSDoc comment start - * - ** /: JSDoc comment end - * - &: HTML entities - * - * XMLDoc (C#): - * - <: >: XML tags - * - &: ': ": <: >: XML special characters - * - {: }: Used for interpolated strings - * - ///: Comment marker - * - /**: Block comment start - * - ** /: Block comment end - * - * Javadoc (Java): - * - @: Used for Javadoc tags - * - <: >: HTML tags - * - &: HTML entities - * - *: Can interfere with comment blocks - * - /**: Javadoc comment start - * - ** /: Javadoc comment end - * - * Doxygen (C++): - * - \: Used for Doxygen commands - * - @: Alternative command prefix - * - <: >: XML/HTML tags - * - &: HTML entities - * - /**: C-style comment start - * - ** /: C-style comment end - * - * RDoc (Ruby): - * - :: Used in symbol notation - * - =: Section markers - * - #: Comment marker - * - =begin: Block comment start - * - =end: Block comment end - * - @: Instance variable prefix - * - $: Global variable prefix - * - %: String literal delimiter - * - #{: String interpolation start - * - }: String interpolation end - * - * PHPDoc (PHP): - * - @: Used for PHPDoc tags - * - {: }: Used for type definitions - * - $: Variable prefix - * - /**: PHPDoc comment start - * - ** /: PHPDoc comment end - * - *: Can interfere with comment blocks - * - &: HTML entities - */ - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts deleted file mode 100644 index ef1aee2d386e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithEnumBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithEnumBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts deleted file mode 100644 index 203651bfb712..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index 4023a0068946..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const WeatherReport = { - Sunny: "SUNNY", - Cloudy: "CLOUDY", - Raining: "RAINING", - Snowing: "SNOWING", -} as const; -export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts deleted file mode 100644 index c2a44b58ecd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * from "./enum/errors/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * from "./object/errors/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * from "./union/errors/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts deleted file mode 100644 index 2681788e4f04..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts deleted file mode 100644 index 203710315112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts deleted file mode 100644 index 230964f8467f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts deleted file mode 100644 index b8a86dc99dd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts deleted file mode 100644 index e38a83090455..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./NestedObjectWithOptionalFieldError.js"; -export * from "./NestedObjectWithRequiredFieldError.js"; -export * from "./ObjectWithOptionalFieldError.js"; -export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index 4898ba728836..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface DoubleOptional { - optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index 324bb2e73908..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithOptionalField { - string?: string; - nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index 322dcfbd5c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithRequiredField { - string: string; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index b35138a717bb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithMapOfMap { - map: Record>; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 2e6b3811b575..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithOptionalField { - /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ - string?: string; - integer?: number; - long?: number; - double?: number; - bool?: boolean; - datetime?: Date; - date?: string; - uuid?: string; - base64?: string; - list?: string[]; - set?: Set; - map?: Record; - bigint?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index 032a84135c9e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithRequiredField { - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index 5dac5b761df8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts deleted file mode 100644 index c0e5b750495f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithUnionBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithUnionBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts deleted file mode 100644 index 940b191924ee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index f5336c6b33bc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; - -export namespace Animal { - export interface Dog extends SeedExhaustive.types.Dog { - animal: "dog"; - } - - export interface Cat extends SeedExhaustive.types.Cat { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index aa74d5b7dd01..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Cat { - name: string; - likesToMeow: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 24bc9aa321b1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Dog { - name: string; - likesToWoof: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts deleted file mode 100644 index b556b3f7bd94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../core/index.js"; -import * as errors from "../errors/index.js"; - -export namespace BearerAuthProvider { - export interface Options { - token?: core.Supplier; - } -} - -export class BearerAuthProvider implements core.AuthProvider { - private readonly token: core.Supplier; - - constructor(options: BearerAuthProvider.Options) { - this.token = options.token; - } - - public static canCreate(options: BearerAuthProvider.Options): boolean { - return options.token != null; - } - - public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { - const token = await core.Supplier.get(this.token); - if (token == null) { - throw new errors.SeedExhaustiveError({ - message: "Please specify a token by passing it in to the constructor", - }); - } - - return { - headers: { Authorization: `Bearer ${token}` }, - }; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts deleted file mode 100644 index 0ecb12b79bdb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts deleted file mode 100644 index 895a50ff30da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export interface AuthProvider { - getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts deleted file mode 100644 index f6218b42211e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Request parameters for authentication requests. - */ -export interface AuthRequest { - /** - * The headers to be included in the request. - */ - headers: Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts deleted file mode 100644 index a64235910062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { base64Decode, base64Encode } from "../base64.js"; - -export interface BasicAuth { - username: string; - password: string; -} - -const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; - -export const BasicAuth = { - toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { - if (basicAuth == null) { - return undefined; - } - const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); - return `Basic ${token}`; - }, - fromAuthorizationHeader: (header: string): BasicAuth => { - const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); - const decoded = base64Decode(credentials); - const [username, ...passwordParts] = decoded.split(":"); - const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; - - if (username == null || password == null) { - throw new Error("Invalid basic auth"); - } - return { - username, - password, - }; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts deleted file mode 100644 index c44a06c38f06..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type BearerToken = string; - -const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; - -function toAuthorizationHeader(token: string | undefined): string | undefined { - if (token == null) { - return undefined; - } - return `Bearer ${token}`; -} - -export const BearerToken: { - toAuthorizationHeader: typeof toAuthorizationHeader; - fromAuthorizationHeader: (header: string) => BearerToken; -} = { - toAuthorizationHeader: toAuthorizationHeader, - fromAuthorizationHeader: (header: string): BearerToken => { - return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts deleted file mode 100644 index 5b7acfd2bd8b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { AuthProvider } from "./AuthProvider.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export class NoOpAuthProvider implements AuthProvider { - public getAuthRequest(): Promise { - return Promise.resolve({ headers: {} }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts deleted file mode 100644 index 2215b227709e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { AuthProvider } from "./AuthProvider.js"; -export type { AuthRequest } from "./AuthRequest.js"; -export { BasicAuth } from "./BasicAuth.js"; -export { BearerToken } from "./BearerToken.js"; -export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts deleted file mode 100644 index 448a0db638a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts +++ /dev/null @@ -1,27 +0,0 @@ -function base64ToBytes(base64: string): Uint8Array { - const binString = atob(base64); - return Uint8Array.from(binString, (m) => m.codePointAt(0)!); -} - -function bytesToBase64(bytes: Uint8Array): string { - const binString = String.fromCodePoint(...bytes); - return btoa(binString); -} - -export function base64Encode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "utf8").toString("base64"); - } - - const bytes = new TextEncoder().encode(input); - return bytesToBase64(bytes); -} - -export function base64Decode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "base64").toString("utf8"); - } - - const bytes = base64ToBytes(input); - return new TextDecoder().decode(bytes); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts deleted file mode 100644 index 69296d7100d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts deleted file mode 100644 index 97ab83c2b195..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RawResponse } from "./RawResponse.js"; - -/** - * The response of an API call. - * It is a successful response or a failed response. - */ -export type APIResponse = SuccessfulResponse | FailedResponse; - -export interface SuccessfulResponse { - ok: true; - body: T; - /** - * @deprecated Use `rawResponse` instead - */ - headers?: Record; - rawResponse: RawResponse; -} - -export interface FailedResponse { - ok: false; - error: T; - rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts deleted file mode 100644 index bca7f4c77981..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type BinaryResponse = { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - bodyUsed: Response["bodyUsed"]; - /** - * Returns a ReadableStream of the response body. - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) - */ - stream: () => Response["body"]; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer: () => ReturnType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob: () => ReturnType; - /** - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) - * Some versions of the Fetch API may not support this method. - */ - bytes?(): ReturnType; -}; - -export function getBinaryResponse(response: Response): BinaryResponse { - const binaryResponse: BinaryResponse = { - get bodyUsed() { - return response.bodyUsed; - }, - stream: () => response.body, - arrayBuffer: response.arrayBuffer.bind(response), - blob: response.blob.bind(response), - }; - if ("bytes" in response && typeof response.bytes === "function") { - binaryResponse.bytes = response.bytes.bind(response); - } - - return binaryResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts deleted file mode 100644 index 998d68f5c20c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type SecuritySchemeKey = string; -/** - * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. - * All schemes in the collection must be satisfied for authentication to be successful. - */ -export type SecuritySchemeCollection = Record; -export type AuthScope = string; -export type EndpointMetadata = { - /** - * An array of security scheme collections. Each collection represents an alternative way to authenticate. - */ - security?: SecuritySchemeCollection[]; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts deleted file mode 100644 index 8079841c4062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import type { Supplier } from "./Supplier.js"; - -type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; -export type EndpointSupplier = Supplier | EndpointSupplierFn; -export const EndpointSupplier = { - get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { - if (typeof supplier === "function") { - return (supplier as EndpointSupplierFn)(arg); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts deleted file mode 100644 index 58bb0e3ef7d9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts +++ /dev/null @@ -1,391 +0,0 @@ -import { toJson } from "../json.js"; -import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; -import type { APIResponse } from "./APIResponse.js"; -import { createRequestUrl } from "./createRequestUrl.js"; -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import { EndpointSupplier } from "./EndpointSupplier.js"; -import { getErrorResponseBody } from "./getErrorResponseBody.js"; -import { getFetchFn } from "./getFetchFn.js"; -import { getRequestBody } from "./getRequestBody.js"; -import { getResponseBody } from "./getResponseBody.js"; -import { Headers } from "./Headers.js"; -import { makeRequest } from "./makeRequest.js"; -import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -import { requestWithRetries } from "./requestWithRetries.js"; - -export type FetchFunction = (args: Fetcher.Args) => Promise>; - -export declare namespace Fetcher { - export interface Args { - url: string; - method: string; - contentType?: string; - headers?: Record | null | undefined>; - queryParameters?: Record; - body?: unknown; - timeoutMs?: number; - maxRetries?: number; - withCredentials?: boolean; - abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes" | "form" | "other"; - responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; - duplex?: "half"; - endpointMetadata?: EndpointMetadata; - fetchFn?: typeof fetch; - logging?: LogConfig | Logger; - } - - export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; - - export interface FailedStatusCodeError { - reason: "status-code"; - statusCode: number; - body: unknown; - } - - export interface NonJsonError { - reason: "non-json"; - statusCode: number; - rawBody: string; - } - - export interface BodyIsNullError { - reason: "body-is-null"; - statusCode: number; - } - - export interface TimeoutError { - reason: "timeout"; - } - - export interface UnknownError { - reason: "unknown"; - errorMessage: string; - } -} - -const SENSITIVE_HEADERS = new Set([ - "authorization", - "www-authenticate", - "x-api-key", - "api-key", - "apikey", - "x-api-token", - "x-auth-token", - "auth-token", - "cookie", - "set-cookie", - "proxy-authorization", - "proxy-authenticate", - "x-csrf-token", - "x-xsrf-token", - "x-session-token", - "x-access-token", -]); - -function redactHeaders(headers: Headers | Record): Record { - const filtered: Record = {}; - for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { - if (SENSITIVE_HEADERS.has(key.toLowerCase())) { - filtered[key] = "[REDACTED]"; - } else { - filtered[key] = value; - } - } - return filtered; -} - -const SENSITIVE_QUERY_PARAMS = new Set([ - "api_key", - "api-key", - "apikey", - "token", - "access_token", - "access-token", - "auth_token", - "auth-token", - "password", - "passwd", - "secret", - "api_secret", - "api-secret", - "apisecret", - "key", - "session", - "session_id", - "session-id", -]); - -function redactQueryParameters(queryParameters?: Record): Record | undefined { - if (queryParameters == null) { - return queryParameters; - } - const redacted: Record = {}; - for (const [key, value] of Object.entries(queryParameters)) { - if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { - redacted[key] = "[REDACTED]"; - } else { - redacted[key] = value; - } - } - return redacted; -} - -function redactUrl(url: string): string { - const protocolIndex = url.indexOf("://"); - if (protocolIndex === -1) return url; - - const afterProtocol = protocolIndex + 3; - - // Find the first delimiter that marks the end of the authority section - const pathStart = url.indexOf("/", afterProtocol); - let queryStart = url.indexOf("?", afterProtocol); - let fragmentStart = url.indexOf("#", afterProtocol); - - const firstDelimiter = Math.min( - pathStart === -1 ? url.length : pathStart, - queryStart === -1 ? url.length : queryStart, - fragmentStart === -1 ? url.length : fragmentStart, - ); - - // Find the LAST @ before the delimiter (handles multiple @ in credentials) - let atIndex = -1; - for (let i = afterProtocol; i < firstDelimiter; i++) { - if (url[i] === "@") { - atIndex = i; - } - } - - if (atIndex !== -1) { - url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; - } - - // Recalculate queryStart since url might have changed - queryStart = url.indexOf("?"); - if (queryStart === -1) return url; - - fragmentStart = url.indexOf("#", queryStart); - const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; - const queryString = url.slice(queryStart + 1, queryEnd); - - if (queryString.length === 0) return url; - - // FAST PATH: Quick check if any sensitive keywords present - // Using indexOf is faster than regex for simple substring matching - const lower = queryString.toLowerCase(); - const hasSensitive = - lower.includes("token") || - lower.includes("key") || - lower.includes("password") || - lower.includes("passwd") || - lower.includes("secret") || - lower.includes("session") || - lower.includes("auth"); - - if (!hasSensitive) { - return url; - } - - // SLOW PATH: Parse and redact - const redactedParams: string[] = []; - const params = queryString.split("&"); - - for (const param of params) { - const equalIndex = param.indexOf("="); - if (equalIndex === -1) { - redactedParams.push(param); - continue; - } - - const key = param.slice(0, equalIndex); - let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); - - if (!shouldRedact && key.includes("%")) { - try { - const decodedKey = decodeURIComponent(key); - shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); - } catch {} - } - - redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); - } - - return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); -} - -async function getHeaders(args: Fetcher.Args): Promise { - const newHeaders: Headers = new Headers(); - - newHeaders.set( - "Accept", - args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", - ); - if (args.body !== undefined && args.contentType != null) { - newHeaders.set("Content-Type", args.contentType); - } - - if (args.headers == null) { - return newHeaders; - } - - for (const [key, value] of Object.entries(args.headers)) { - const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); - if (typeof result === "string") { - newHeaders.set(key, result); - continue; - } - if (result == null) { - continue; - } - newHeaders.set(key, `${result}`); - } - return newHeaders; -} - -export async function fetcherImpl(args: Fetcher.Args): Promise> { - const url = createRequestUrl(args.url, args.queryParameters); - const requestBody: BodyInit | undefined = await getRequestBody({ - body: args.body, - type: args.requestType ?? "other", - }); - const fetchFn = args.fetchFn ?? (await getFetchFn()); - const headers = await getHeaders(args); - const logger = createLogger(args.logging); - - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - headers: redactHeaders(headers), - queryParameters: redactQueryParameters(args.queryParameters), - hasBody: requestBody != null, - }; - logger.debug("Making HTTP request", metadata); - } - - try { - const response = await requestWithRetries( - async () => - makeRequest( - fetchFn, - url, - args.method, - headers, - requestBody, - args.timeoutMs, - args.abortSignal, - args.withCredentials, - args.duplex, - ), - args.maxRetries, - ); - - if (response.status >= 200 && response.status < 400) { - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(response.headers), - }; - logger.debug("HTTP request succeeded", metadata); - } - const body = await getResponseBody(response, args.responseType); - return { - ok: true, - body: body as R, - headers: response.headers, - rawResponse: toRawResponse(response), - }; - } else { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), - }; - logger.error("HTTP request failed with error status", metadata); - } - return { - ok: false, - error: { - reason: "status-code", - statusCode: response.status, - body: await getErrorResponseBody(response), - }, - rawResponse: toRawResponse(response), - }; - } - } catch (error) { - if (args.abortSignal?.aborted) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - }; - logger.error("HTTP request was aborted", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: "The user aborted a request", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error && error.name === "AbortError") { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - timeoutMs: args.timeoutMs, - }; - logger.error("HTTP request timed out", metadata); - } - return { - ok: false, - error: { - reason: "timeout", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - errorMessage: error.message, - }; - logger.error("HTTP request failed with error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: error.message, - }, - rawResponse: unknownRawResponse, - }; - } - - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - error: toJson(error), - }; - logger.error("HTTP request failed with unknown error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: toJson(error), - }, - rawResponse: unknownRawResponse, - }; - } -} - -export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts deleted file mode 100644 index af841aa24f55..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts +++ /dev/null @@ -1,93 +0,0 @@ -let Headers: typeof globalThis.Headers; - -if (typeof globalThis.Headers !== "undefined") { - Headers = globalThis.Headers; -} else { - Headers = class Headers implements Headers { - private headers: Map; - - constructor(init?: HeadersInit) { - this.headers = new Map(); - - if (init) { - if (init instanceof Headers) { - init.forEach((value, key) => this.append(key, value)); - } else if (Array.isArray(init)) { - for (const [key, value] of init) { - if (typeof key === "string" && typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Each header entry must be a [string, string] tuple"); - } - } - } else { - for (const [key, value] of Object.entries(init)) { - if (typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Header values must be strings"); - } - } - } - } - } - - append(name: string, value: string): void { - const key = name.toLowerCase(); - const existing = this.headers.get(key) || []; - this.headers.set(key, [...existing, value]); - } - - delete(name: string): void { - const key = name.toLowerCase(); - this.headers.delete(key); - } - - get(name: string): string | null { - const key = name.toLowerCase(); - const values = this.headers.get(key); - return values ? values.join(", ") : null; - } - - has(name: string): boolean { - const key = name.toLowerCase(); - return this.headers.has(key); - } - - set(name: string, value: string): void { - const key = name.toLowerCase(); - this.headers.set(key, [value]); - } - - forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { - const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; - this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); - } - - getSetCookie(): string[] { - return this.headers.get("set-cookie") || []; - } - - *entries(): HeadersIterator<[string, string]> { - for (const [key, values] of this.headers.entries()) { - yield [key, values.join(", ")]; - } - } - - *keys(): HeadersIterator { - yield* this.headers.keys(); - } - - *values(): HeadersIterator { - for (const values of this.headers.values()) { - yield values.join(", "); - } - } - - [Symbol.iterator](): HeadersIterator<[string, string]> { - return this.entries(); - } - }; -} - -export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts deleted file mode 100644 index 692ca7d795f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { WithRawResponse } from "./RawResponse.js"; - -/** - * A promise that returns the parsed response and lets you retrieve the raw response too. - */ -export class HttpResponsePromise extends Promise { - private innerPromise: Promise>; - private unwrappedPromise: Promise | undefined; - - private constructor(promise: Promise>) { - // Initialize with a no-op to avoid premature parsing - super((resolve) => { - resolve(undefined as unknown as T); - }); - this.innerPromise = promise; - } - - /** - * Creates an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @param args - Arguments to pass to the function. - * @returns An `HttpResponsePromise` instance. - */ - public static fromFunction Promise>, T>( - fn: F, - ...args: Parameters - ): HttpResponsePromise { - return new HttpResponsePromise(fn(...args)); - } - - /** - * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @returns A function that returns an `HttpResponsePromise` instance. - */ - public static interceptFunction< - F extends (...args: never[]) => Promise>, - T = Awaited>["data"], - >(fn: F): (...args: Parameters) => HttpResponsePromise { - return (...args: Parameters): HttpResponsePromise => { - return HttpResponsePromise.fromPromise(fn(...args)); - }; - } - - /** - * Creates an `HttpResponsePromise` from an existing promise. - * - * @param promise - A promise resolving to a `WithRawResponse` object. - * @returns An `HttpResponsePromise` instance. - */ - public static fromPromise(promise: Promise>): HttpResponsePromise { - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from an executor function. - * - * @param executor - A function that takes resolve and reject callbacks to create a promise. - * @returns An `HttpResponsePromise` instance. - */ - public static fromExecutor( - executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, - ): HttpResponsePromise { - const promise = new Promise>(executor); - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from a resolved result. - * - * @param result - A `WithRawResponse` object to resolve immediately. - * @returns An `HttpResponsePromise` instance. - */ - public static fromResult(result: WithRawResponse): HttpResponsePromise { - const promise = Promise.resolve(result); - return new HttpResponsePromise(promise); - } - - private unwrap(): Promise { - if (!this.unwrappedPromise) { - this.unwrappedPromise = this.innerPromise.then(({ data }) => data); - } - return this.unwrappedPromise; - } - - /** @inheritdoc */ - public override then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, - ): Promise { - return this.unwrap().then(onfulfilled, onrejected); - } - - /** @inheritdoc */ - public override catch( - onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, - ): Promise { - return this.unwrap().catch(onrejected); - } - - /** @inheritdoc */ - public override finally(onfinally?: (() => void) | null): Promise { - return this.unwrap().finally(onfinally); - } - - /** - * Retrieves the data and raw response. - * - * @returns A promise resolving to a `WithRawResponse` object. - */ - public async withRawResponse(): Promise> { - return await this.innerPromise; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts deleted file mode 100644 index 37fb44e2aa99..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Headers } from "./Headers.js"; - -/** - * The raw response from the fetch call excluding the body. - */ -export type RawResponse = Omit< - { - [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions - }, - "ok" | "body" | "bodyUsed" ->; // strips out body and bodyUsed - -/** - * A raw response indicating that the request was aborted. - */ -export const abortRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 499, - statusText: "Client Closed Request", - type: "error", - url: "", -} as const; - -/** - * A raw response indicating an unknown error. - */ -export const unknownRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 0, - statusText: "Unknown Error", - type: "error", - url: "", -} as const; - -/** - * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, - * excluding the `body` and `bodyUsed` fields. - * - * @param response - The `RawResponse` object to convert. - * @returns A `RawResponse` object containing the extracted properties of the input response. - */ -export function toRawResponse(response: Response): RawResponse { - return { - headers: response.headers, - redirected: response.redirected, - status: response.status, - statusText: response.statusText, - type: response.type, - url: response.url, - }; -} - -/** - * Creates a `RawResponse` from a standard `Response` object. - */ -export interface WithRawResponse { - readonly data: T; - readonly rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts deleted file mode 100644 index 867c931c02f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type Supplier = T | Promise | (() => T | Promise); - -export const Supplier = { - get: async (supplier: Supplier): Promise => { - if (typeof supplier === "function") { - return (supplier as () => T)(); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts deleted file mode 100644 index 88e13265e112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { toQueryString } from "../url/qs.js"; - -export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { - const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); - return queryString ? `${baseUrl}?${queryString}` : baseUrl; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts deleted file mode 100644 index 7cf4e623c2f5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { fromJson } from "../json.js"; -import { getResponseBody } from "./getResponseBody.js"; - -export async function getErrorResponseBody(response: Response): Promise { - let contentType = response.headers.get("Content-Type")?.toLowerCase(); - if (contentType == null || contentType.length === 0) { - return getResponseBody(response); - } - - if (contentType.indexOf(";") !== -1) { - contentType = contentType.split(";")[0]?.trim() ?? ""; - } - switch (contentType) { - case "application/hal+json": - case "application/json": - case "application/ld+json": - case "application/problem+json": - case "application/vnd.api+json": - case "text/json": { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - default: - if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - - // Fallback to plain text if content type is not recognized - // Even if no body is present, the response will be an empty string - return await response.text(); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts deleted file mode 100644 index 9f845b956392..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function getFetchFn(): Promise { - return fetch; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts deleted file mode 100644 index 50f922b0e87f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function getHeader(headers: Record, header: string): string | undefined { - for (const [headerKey, headerValue] of Object.entries(headers)) { - if (headerKey.toLowerCase() === header.toLowerCase()) { - return headerValue; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts deleted file mode 100644 index 91d9d81f50e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toJson } from "../json.js"; -import { toQueryString } from "../url/qs.js"; - -export declare namespace GetRequestBody { - interface Args { - body: unknown; - type: "json" | "file" | "bytes" | "form" | "other"; - } -} - -export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { - if (type === "form") { - return toQueryString(body, { arrayFormat: "repeat", encode: true }); - } - if (type.includes("json")) { - return toJson(body); - } else { - return body as BodyInit; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts deleted file mode 100644 index 708d55728f2b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { fromJson } from "../json.js"; -import { getBinaryResponse } from "./BinaryResponse.js"; - -export async function getResponseBody(response: Response, responseType?: string): Promise { - switch (responseType) { - case "binary-response": - return getBinaryResponse(response); - case "blob": - return await response.blob(); - case "arrayBuffer": - return await response.arrayBuffer(); - case "sse": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - return response.body; - case "streaming": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - - return response.body; - - case "text": - return await response.text(); - } - - // if responseType is "json" or not specified, try to parse as JSON - const text = await response.text(); - if (text.length > 0) { - try { - const responseBody = fromJson(text); - return responseBody; - } catch (_err) { - return { - ok: false, - error: { - reason: "non-json", - statusCode: response.status, - rawBody: text, - }, - }; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts deleted file mode 100644 index c3bc6da20f49..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type { APIResponse } from "./APIResponse.js"; -export type { BinaryResponse } from "./BinaryResponse.js"; -export type { EndpointMetadata } from "./EndpointMetadata.js"; -export { EndpointSupplier } from "./EndpointSupplier.js"; -export type { Fetcher, FetchFunction } from "./Fetcher.js"; -export { fetcher } from "./Fetcher.js"; -export { getHeader } from "./getHeader.js"; -export { HttpResponsePromise } from "./HttpResponsePromise.js"; -export type { RawResponse, WithRawResponse } from "./RawResponse.js"; -export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts deleted file mode 100644 index 921565eb0063..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { anySignal, getTimeoutSignal } from "./signals.js"; - -export const makeRequest = async ( - fetchFn: (url: string, init: RequestInit) => Promise, - url: string, - method: string, - headers: Headers | Record, - requestBody: BodyInit | undefined, - timeoutMs?: number, - abortSignal?: AbortSignal, - withCredentials?: boolean, - duplex?: "half", -): Promise => { - const signals: AbortSignal[] = []; - - let timeoutAbortId: ReturnType | undefined; - if (timeoutMs != null) { - const { signal, abortId } = getTimeoutSignal(timeoutMs); - timeoutAbortId = abortId; - signals.push(signal); - } - - if (abortSignal != null) { - signals.push(abortSignal); - } - const newSignals = anySignal(signals); - const response = await fetchFn(url, { - method: method, - headers, - body: requestBody, - signal: newSignals, - credentials: withCredentials ? "include" : undefined, - // @ts-ignore - duplex, - }); - - if (timeoutAbortId != null) { - clearTimeout(timeoutAbortId); - } - - return response; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts deleted file mode 100644 index 1f689688c4b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts +++ /dev/null @@ -1,64 +0,0 @@ -const INITIAL_RETRY_DELAY = 1000; // in milliseconds -const MAX_RETRY_DELAY = 60000; // in milliseconds -const DEFAULT_MAX_RETRIES = 2; -const JITTER_FACTOR = 0.2; // 20% random jitter - -function addPositiveJitter(delay: number): number { - const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function addSymmetricJitter(delay: number): number { - const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { - const retryAfter = response.headers.get("Retry-After"); - if (retryAfter) { - const retryAfterSeconds = parseInt(retryAfter, 10); - if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { - return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); - } - - const retryAfterDate = new Date(retryAfter); - if (!Number.isNaN(retryAfterDate.getTime())) { - const delay = retryAfterDate.getTime() - Date.now(); - if (delay > 0) { - return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); - } - } - } - - const rateLimitReset = response.headers.get("X-RateLimit-Reset"); - if (rateLimitReset) { - const resetTime = parseInt(rateLimitReset, 10); - if (!Number.isNaN(resetTime)) { - const delay = resetTime * 1000 - Date.now(); - if (delay > 0) { - return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); - } - } - } - - return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); -} - -export async function requestWithRetries( - requestFn: () => Promise, - maxRetries: number = DEFAULT_MAX_RETRIES, -): Promise { - let response: Response = await requestFn(); - - for (let i = 0; i < maxRetries; ++i) { - if ([408, 429].includes(response.status) || response.status >= 500) { - const delay = getRetryDelayFromHeaders(response, i); - - await new Promise((resolve) => setTimeout(resolve, delay)); - response = await requestFn(); - } else { - break; - } - } - return response!; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts deleted file mode 100644 index 7bd3757ec3a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts +++ /dev/null @@ -1,26 +0,0 @@ -const TIMEOUT = "timeout"; - -export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { - const controller = new AbortController(); - const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); - return { signal: controller.signal, abortId }; -} - -export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { - const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; - - const controller = new AbortController(); - - for (const signal of signals) { - if (signal.aborted) { - controller.abort((signal as any)?.reason); - break; - } - - signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { - signal: controller.signal, - }); - } - - return controller.signal; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts deleted file mode 100644 index 78ed8b500c95..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts +++ /dev/null @@ -1,35 +0,0 @@ -export function mergeHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } else if (insensitiveKey in result) { - delete result[insensitiveKey]; - } - } - - return result; -} - -export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } - } - - return result; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts deleted file mode 100644 index 92290bfadcac..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from "./auth/index.js"; -export * from "./base64.js"; -export * from "./fetcher/index.js"; -export * as logging from "./logging/index.js"; -export * from "./runtime/index.js"; -export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts deleted file mode 100644 index c052f3249f4f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Serialize a value to JSON - * @param value A JavaScript value, usually an object or array, to be converted. - * @param replacer A function that transforms the results. - * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. - * @returns JSON string - */ -export const toJson = ( - value: unknown, - replacer?: (this: unknown, key: string, value: unknown) => unknown, - space?: string | number, -): string => { - return JSON.stringify(value, replacer, space); -}; - -/** - * Parse JSON string to object, array, or other type - * @param text A valid JSON string. - * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. - * @returns Parsed object, array, or other type - */ -export function fromJson( - text: string, - reviver?: (this: unknown, key: string, value: unknown) => unknown, -): T { - return JSON.parse(text, reviver); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts deleted file mode 100644 index 88f6c00db0cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as logger from "./logger.js"; - -export namespace logging { - /** - * Configuration for logger instances. - */ - export type LogConfig = logger.LogConfig; - export type LogLevel = logger.LogLevel; - export const LogLevel: typeof logger.LogLevel = logger.LogLevel; - export type ILogger = logger.ILogger; - /** - * Console logger implementation that outputs to the console. - */ - export type ConsoleLogger = logger.ConsoleLogger; - /** - * Console logger implementation that outputs to the console. - */ - export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts deleted file mode 100644 index d81cc32c40f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts deleted file mode 100644 index a3f3673cda93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts +++ /dev/null @@ -1,203 +0,0 @@ -export const LogLevel = { - Debug: "debug", - Info: "info", - Warn: "warn", - Error: "error", -} as const; -export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; -const logLevelMap: Record = { - [LogLevel.Debug]: 1, - [LogLevel.Info]: 2, - [LogLevel.Warn]: 3, - [LogLevel.Error]: 4, -}; - -export interface ILogger { - /** - * Logs a debug message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - debug(message: string, ...args: unknown[]): void; - /** - * Logs an info message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - info(message: string, ...args: unknown[]): void; - /** - * Logs a warning message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - warn(message: string, ...args: unknown[]): void; - /** - * Logs an error message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - error(message: string, ...args: unknown[]): void; -} - -/** - * Configuration for logger initialization. - */ -export interface LogConfig { - /** - * Minimum log level to output. - * @default LogLevel.Info - */ - level?: LogLevel; - /** - * Logger implementation to use. - * @default new ConsoleLogger() - */ - logger?: ILogger; - /** - * Whether logging should be silenced. - * @default true - */ - silent?: boolean; -} - -/** - * Default console-based logger implementation. - */ -export class ConsoleLogger implements ILogger { - debug(message: string, ...args: unknown[]): void { - console.debug(message, ...args); - } - info(message: string, ...args: unknown[]): void { - console.info(message, ...args); - } - warn(message: string, ...args: unknown[]): void { - console.warn(message, ...args); - } - error(message: string, ...args: unknown[]): void { - console.error(message, ...args); - } -} - -/** - * Logger class that provides level-based logging functionality. - */ -export class Logger { - private readonly level: number; - private readonly logger: ILogger; - private readonly silent: boolean; - - /** - * Creates a new logger instance. - * @param config - Logger configuration - */ - constructor(config: Required) { - this.level = logLevelMap[config.level]; - this.logger = config.logger; - this.silent = config.silent; - } - - /** - * Checks if a log level should be output based on configuration. - * @param level - The log level to check - * @returns True if the level should be logged - */ - public shouldLog(level: LogLevel): boolean { - return !this.silent && this.level <= logLevelMap[level]; - } - - /** - * Checks if debug logging is enabled. - * @returns True if debug logs should be output - */ - public isDebug(): boolean { - return this.shouldLog(LogLevel.Debug); - } - - /** - * Logs a debug message if debug logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public debug(message: string, ...args: unknown[]): void { - if (this.isDebug()) { - this.logger.debug(message, ...args); - } - } - - /** - * Checks if info logging is enabled. - * @returns True if info logs should be output - */ - public isInfo(): boolean { - return this.shouldLog(LogLevel.Info); - } - - /** - * Logs an info message if info logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public info(message: string, ...args: unknown[]): void { - if (this.isInfo()) { - this.logger.info(message, ...args); - } - } - - /** - * Checks if warning logging is enabled. - * @returns True if warning logs should be output - */ - public isWarn(): boolean { - return this.shouldLog(LogLevel.Warn); - } - - /** - * Logs a warning message if warning logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public warn(message: string, ...args: unknown[]): void { - if (this.isWarn()) { - this.logger.warn(message, ...args); - } - } - - /** - * Checks if error logging is enabled. - * @returns True if error logs should be output - */ - public isError(): boolean { - return this.shouldLog(LogLevel.Error); - } - - /** - * Logs an error message if error logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public error(message: string, ...args: unknown[]): void { - if (this.isError()) { - this.logger.error(message, ...args); - } - } -} - -export function createLogger(config?: LogConfig | Logger): Logger { - if (config == null) { - return defaultLogger; - } - if (config instanceof Logger) { - return config; - } - config = config ?? {}; - config.level ??= LogLevel.Info; - config.logger ??= new ConsoleLogger(); - config.silent ??= true; - return new Logger(config as Required); -} - -const defaultLogger: Logger = new Logger({ - level: LogLevel.Info, - logger: new ConsoleLogger(), - silent: true, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts deleted file mode 100644 index cfab23f9a834..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts deleted file mode 100644 index 56ebbb87c4d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts +++ /dev/null @@ -1,134 +0,0 @@ -interface DenoGlobal { - version: { - deno: string; - }; -} - -interface BunGlobal { - version: string; -} - -declare const Deno: DenoGlobal | undefined; -declare const Bun: BunGlobal | undefined; -declare const EdgeRuntime: string | undefined; -declare const self: typeof globalThis.self & { - importScripts?: unknown; -}; - -/** - * A constant that indicates which environment and version the SDK is running in. - */ -export const RUNTIME: Runtime = evaluateRuntime(); - -export interface Runtime { - type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; - version?: string; - parsedVersion?: number; -} - -function evaluateRuntime(): Runtime { - /** - * A constant that indicates whether the environment the code is running is a Web Browser. - */ - const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - if (isBrowser) { - return { - type: "browser", - version: window.navigator.userAgent, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Cloudflare. - * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent - */ - const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; - if (isCloudflare) { - return { - type: "workerd", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Edge Runtime. - * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime - */ - const isEdgeRuntime = typeof EdgeRuntime === "string"; - if (isEdgeRuntime) { - return { - type: "edge-runtime", - }; - } - - /** - * A constant that indicates whether the environment the code is running is a Web Worker. - */ - const isWebWorker = - typeof self === "object" && - typeof self?.importScripts === "function" && - (self.constructor?.name === "DedicatedWorkerGlobalScope" || - self.constructor?.name === "ServiceWorkerGlobalScope" || - self.constructor?.name === "SharedWorkerGlobalScope"); - if (isWebWorker) { - return { - type: "web-worker", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Deno. - * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions - */ - const isDeno = - typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - if (isDeno) { - return { - type: "deno", - version: Deno.version.deno, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Bun.sh. - */ - const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; - if (isBun) { - return { - type: "bun", - version: Bun.version, - }; - } - - /** - * A constant that indicates whether the environment the code is running is in React-Native. - * This check should come before Node.js detection since React Native may have a process polyfill. - * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js - */ - const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; - if (isReactNative) { - return { - type: "react-native", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ - const isNode = - typeof process !== "undefined" && - "version" in process && - !!process.version && - "versions" in process && - !!process.versions?.node; - if (isNode) { - return { - type: "node", - version: process.versions.node, - parsedVersion: Number(process.versions.node.split(".")[0]), - }; - } - - return { - type: "unknown", - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts deleted file mode 100644 index 19b901244218..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function encodePathParam(param: unknown): string { - if (param === null) { - return "null"; - } - const typeofParam = typeof param; - switch (typeofParam) { - case "undefined": - return "undefined"; - case "string": - case "number": - case "boolean": - break; - default: - param = String(param); - break; - } - return encodeURIComponent(param as string | number | boolean); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts deleted file mode 100644 index f2e0fa2d2221..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { encodePathParam } from "./encodePathParam.js"; -export { join } from "./join.js"; -export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts deleted file mode 100644 index 7ca7daef094d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts +++ /dev/null @@ -1,79 +0,0 @@ -export function join(base: string, ...segments: string[]): string { - if (!base) { - return ""; - } - - if (segments.length === 0) { - return base; - } - - if (base.includes("://")) { - let url: URL; - try { - url = new URL(base); - } catch { - return joinPath(base, ...segments); - } - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - url.pathname = joinPathSegments(url.pathname, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { - url.pathname += "/"; - } - - return url.toString(); - } - - return joinPath(base, ...segments); -} - -function joinPath(base: string, ...segments: string[]): string { - if (segments.length === 0) { - return base; - } - - let result = base; - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - result = joinPathSegments(result, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !result.endsWith("/")) { - result += "/"; - } - - return result; -} - -function joinPathSegments(left: string, right: string): string { - if (left.endsWith("/")) { - return left + right; - } - return `${left}/${right}`; -} - -function trimSlashes(str: string): string { - if (!str) return str; - - let start = 0; - let end = str.length; - - if (str.startsWith("/")) start = 1; - if (str.endsWith("/")) end = str.length - 1; - - return start === 0 && end === str.length ? str : str.slice(start, end); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts deleted file mode 100644 index 13e89be9d9a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts +++ /dev/null @@ -1,74 +0,0 @@ -interface QueryStringOptions { - arrayFormat?: "indices" | "repeat"; - encode?: boolean; -} - -const defaultQsOptions: Required = { - arrayFormat: "indices", - encode: true, -} as const; - -function encodeValue(value: unknown, shouldEncode: boolean): string { - if (value === undefined) { - return ""; - } - if (value === null) { - return ""; - } - const stringValue = String(value); - return shouldEncode ? encodeURIComponent(stringValue) : stringValue; -} - -function stringifyObject(obj: Record, prefix = "", options: Required): string[] { - const parts: string[] = []; - - for (const [key, value] of Object.entries(obj)) { - const fullKey = prefix ? `${prefix}[${key}]` : key; - - if (value === undefined) { - continue; - } - - if (Array.isArray(value)) { - if (value.length === 0) { - continue; - } - for (let i = 0; i < value.length; i++) { - const item = value[i]; - if (item === undefined) { - continue; - } - if (typeof item === "object" && !Array.isArray(item) && item !== null) { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - parts.push(...stringifyObject(item as Record, arrayKey, options)); - } else { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; - parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); - } - } - } else if (typeof value === "object" && value !== null) { - if (Object.keys(value as Record).length === 0) { - continue; - } - parts.push(...stringifyObject(value as Record, fullKey, options)); - } else { - const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; - parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); - } - } - - return parts; -} - -export function toQueryString(obj: unknown, options?: QueryStringOptions): string { - if (obj == null || typeof obj !== "object") { - return ""; - } - - const parts = stringifyObject(obj as Record, "", { - ...defaultQsOptions, - ...options, - }); - return parts.join("&"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts deleted file mode 100644 index d2e515f5d4e2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import { toJson } from "../core/json.js"; - -export class SeedExhaustiveError extends Error { - public readonly statusCode?: number; - public readonly body?: unknown; - public readonly rawResponse?: core.RawResponse; - - constructor({ - message, - statusCode, - body, - rawResponse, - }: { - message?: string; - statusCode?: number; - body?: unknown; - rawResponse?: core.RawResponse; - }) { - super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - this.statusCode = statusCode; - this.body = body; - this.rawResponse = rawResponse; - } -} - -function buildMessage({ - message, - statusCode, - body, -}: { - message: string | undefined; - statusCode: number | undefined; - body: unknown | undefined; -}): string { - const lines: string[] = []; - if (message != null) { - lines.push(message); - } - - if (statusCode != null) { - lines.push(`Status code: ${statusCode.toString()}`); - } - - if (body != null) { - lines.push(`Body: ${toJson(body, undefined, 2)}`); - } - - return lines.join("\n"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts deleted file mode 100644 index 82a3cb8de266..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export class SeedExhaustiveTimeoutError extends Error { - constructor(message: string) { - super(message); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts deleted file mode 100644 index deb55c602654..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import * as errors from "./index.js"; - -export function handleNonStatusCodeError( - error: core.Fetcher.Error, - rawResponse: core.RawResponse, - method: string, - path: string, -): never { - switch (error.reason) { - case "non-json": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - body: error.rawBody, - rawResponse: rawResponse, - }); - case "body-is-null": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - rawResponse: rawResponse, - }); - case "timeout": - throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); - case "unknown": - throw new errors.SeedExhaustiveError({ - message: error.errorMessage, - rawResponse: rawResponse, - }); - default: - throw new errors.SeedExhaustiveError({ - message: "Unknown error", - rawResponse: rawResponse, - }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts deleted file mode 100644 index 2e2853073a94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; -export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts deleted file mode 100644 index 7b70ee14fc02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts deleted file mode 100644 index 9f0bdd34e0d5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * as SeedExhaustive from "./api/index.js"; -export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -export { SeedExhaustiveClient } from "./Client.js"; -export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; -export * from "./exports.js"; -export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts deleted file mode 100644 index 3e5dc038a0ae..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ /dev/null @@ -1,46 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = z.array(ObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, -}; - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -const _Response_Schema = z.array(ObjectWithRequiredField._schema); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, -}; - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts deleted file mode 100644 index d5c3cd1ae608..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.array(z.string()); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string[]; - json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string[], - json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string[]; -} - -const _Response_Schema = z.array(z.string()); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string[]; - json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string[], - json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts deleted file mode 100644 index 000bdb1a9f9a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ /dev/null @@ -1,47 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = z.record(z.string(), ObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: ( - parsed: Record, - ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, - json: (parsed: Record) => - Object.fromEntries( - Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), - ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, -}; - -export declare namespace Request { - export type Raw = Record; -} - -const _Response_Schema = z.record(z.string(), ObjectWithRequiredField._schema); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: ( - parsed: Record, - ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => - _Response_Schema.parse(raw) as Record, - json: (parsed: Record) => - Object.fromEntries( - Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), - ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, -}; - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts deleted file mode 100644 index f5db8ef1efae..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ /dev/null @@ -1,36 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.record(z.string(), z.string()); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, - json: (parsed: Record) => - parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, -}; - -export declare namespace Request { - export type Raw = Record; -} - -const _Response_Schema = z.record(z.string(), z.string()); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as Record, - json: (parsed: Record) => - parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, -}; - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts deleted file mode 100644 index fb36dd017dc2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ /dev/null @@ -1,46 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = ObjectWithRequiredField._schema.optional(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, - ) => serializers.endpoints.container.getAndReturnOptional.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => - parsed != null - ? ObjectWithRequiredField.json(parsed) - : (parsed as serializers.endpoints.container.getAndReturnOptional.Request.Raw), -}; - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} - -const _Response_Schema = ObjectWithRequiredField._schema.optional(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, - ) => serializers.endpoints.container.getAndReturnOptional.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => - parsed != null - ? ObjectWithRequiredField.json(parsed) - : (parsed as serializers.endpoints.container.getAndReturnOptional.Response.Raw), -}; - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts deleted file mode 100644 index 0c85a32c4a09..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ /dev/null @@ -1,46 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = z.array(ObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, -}; - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -const _Response_Schema = z.array(ObjectWithRequiredField._schema); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, -}; - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts deleted file mode 100644 index f80628d1136e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ /dev/null @@ -1,36 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.array(z.string()).transform((arr) => new Set(arr)); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Set; - json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Set, - json: (parsed: Set) => - Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string[]; -} - -const _Response_Schema = z.array(z.string()).transform((arr) => new Set(arr)); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Set; - json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as Set, - json: (parsed: Set) => - Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index 1972f5b270f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; -export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; -export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; -export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; -export * as getAndReturnOptional from "./getAndReturnOptional.js"; -export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; -export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index e053119b972c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as testDelete from "./testDelete.js"; -export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts deleted file mode 100644 index f770bb3d0434..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.boolean(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.endpoints.httpMethods.testDelete.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.endpoints.httpMethods.testDelete.Response.Raw, -}; - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts deleted file mode 100644 index ee29c6d64e90..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.httpMethods.testGet.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.httpMethods.testGet.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts deleted file mode 100644 index cd7e640937da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as container from "./container/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts deleted file mode 100644 index 2ffc5ec115c4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; - -const _Request_Schema = z.array(NestedObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.NestedObjectWithRequiredField[], - ) => serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField[]) => - parsed.map((item) => - NestedObjectWithRequiredField.json(item), - ) as serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, -}; - -export declare namespace Request { - export type Raw = NestedObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index d00c4c582910..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts deleted file mode 100644 index 62d66628879c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.getWithInlinePath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.getWithInlinePath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts deleted file mode 100644 index 28e0a88b1335..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.getWithPath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.getWithPath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index b30603cae602..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as getWithInlinePath from "./getWithInlinePath.js"; -export * as getWithPath from "./getWithPath.js"; -export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; -export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts deleted file mode 100644 index 920948641520..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts deleted file mode 100644 index f2004c062f3b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts deleted file mode 100644 index 7761ce306fe3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts deleted file mode 100644 index ea9575e1ce1e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.boolean(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Request.Raw, -}; - -export declare namespace Request { - export type Raw = boolean; -} - -const _Response_Schema = z.boolean(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Response.Raw, -}; - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts deleted file mode 100644 index 52cc217d53a2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts deleted file mode 100644 index 337a002320dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string().transform((s) => new Date(s)); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Date; - json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Date, - json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string().transform((s) => new Date(s)); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Date; - json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as Date, - json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts deleted file mode 100644 index b04a1153d28b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.number(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, -}; - -export declare namespace Request { - export type Raw = number; -} - -const _Response_Schema = z.number(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, -}; - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts deleted file mode 100644 index 40b6b5b97418..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.number(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Request.Raw, -}; - -export declare namespace Request { - export type Raw = number; -} - -const _Response_Schema = z.number(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Response.Raw, -}; - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts deleted file mode 100644 index 0fc1f2cdff59..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.number(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Request.Raw, -}; - -export declare namespace Request { - export type Raw = number; -} - -const _Response_Schema = z.number(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Response.Raw, -}; - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts deleted file mode 100644 index ec9d5995de47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts deleted file mode 100644 index 7f5c79800271..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index 9805ab86b129..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as getAndReturnBase64 from "./getAndReturnBase64.js"; -export * as getAndReturnBool from "./getAndReturnBool.js"; -export * as getAndReturnDate from "./getAndReturnDate.js"; -export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; -export * as getAndReturnDouble from "./getAndReturnDouble.js"; -export * as getAndReturnInt from "./getAndReturnInt.js"; -export * as getAndReturnLong from "./getAndReturnLong.js"; -export * as getAndReturnString from "./getAndReturnString.js"; -export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index fda956fe3da3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ErrorCategory_Schema = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); -export const ErrorCategory: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCategory; - json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => serializers.endpoints.ErrorCategory.Raw; -} = { - _schema: _ErrorCategory_Schema, - parse: (raw: unknown) => _ErrorCategory_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCategory, - json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => parsed as serializers.endpoints.ErrorCategory.Raw, -}; - -export declare namespace ErrorCategory { - export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 0daa10ba1c93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,43 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ErrorCode_Schema = z.enum([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", -]); -export const ErrorCode: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCode; - json: (parsed: SeedExhaustive.endpoints.ErrorCode) => serializers.endpoints.ErrorCode.Raw; -} = { - _schema: _ErrorCode_Schema, - parse: (raw: unknown) => _ErrorCode_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCode, - json: (parsed: SeedExhaustive.endpoints.ErrorCode) => parsed as serializers.endpoints.ErrorCode.Raw, -}; - -export declare namespace ErrorCode { - export type Raw = - | "INTERNAL_SERVER_ERROR" - | "UNAUTHORIZED" - | "FORBIDDEN" - | "BAD_REQUEST" - | "CONFLICT" - | "GONE" - | "UNPROCESSABLE_ENTITY" - | "NOT_IMPLEMENTED" - | "BAD_GATEWAY" - | "SERVICE_UNAVAILABLE" - | "Unknown"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 917889e06380..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,38 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ErrorCategory } from "./ErrorCategory.js"; -import { ErrorCode } from "./ErrorCode.js"; - -const _Error__Schema = z.object({ - category: ErrorCategory._schema, - code: ErrorCode._schema, - detail: z.string().optional(), - field: z.string().optional(), -}); -export const Error_: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.Error_; - json: (parsed: SeedExhaustive.endpoints.Error_) => serializers.endpoints.Error_.Raw; -} = { - _schema: _Error__Schema, - parse: (raw: unknown) => _Error__Schema.parse(raw) as SeedExhaustive.endpoints.Error_, - json: (parsed: SeedExhaustive.endpoints.Error_) => - ({ - category: ErrorCategory.json(parsed.category), - code: ErrorCode.json(parsed.code), - detail: parsed.detail, - field: parsed.field, - }) as serializers.endpoints.Error_.Raw, -}; - -export declare namespace Error_ { - export interface Raw { - category: ErrorCategory.Raw; - code: ErrorCode.Raw; - detail?: string | null; - field?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 520e6cfb62b7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Error_ } from "./Error_.js"; - -const _PutResponse_Schema = z.object({ - errors: z.array(Error_._schema).optional(), -}); -export const PutResponse: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.PutResponse; - json: (parsed: SeedExhaustive.endpoints.PutResponse) => serializers.endpoints.PutResponse.Raw; -} = { - _schema: _PutResponse_Schema, - parse: (raw: unknown) => _PutResponse_Schema.parse(raw) as SeedExhaustive.endpoints.PutResponse, - json: (parsed: SeedExhaustive.endpoints.PutResponse) => - ({ - errors: - parsed.errors != null - ? parsed.errors != null - ? parsed.errors.map((item) => Error_.json(item)) - : parsed.errors - : parsed.errors, - }) as serializers.endpoints.PutResponse.Raw, -}; - -export declare namespace PutResponse { - export interface Raw { - errors?: Error_.Raw[] | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index 66e101cdc2d7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as noEndingSlash from "./noEndingSlash.js"; -export * as withEndingSlash from "./withEndingSlash.js"; -export * as withMixedCase from "./withMixedCase.js"; -export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts deleted file mode 100644 index 792cdff843dd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.noEndingSlash.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.noEndingSlash.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts deleted file mode 100644 index 05918aed9575..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.withEndingSlash.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.withEndingSlash.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts deleted file mode 100644 index ef6df73d7ec0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.withMixedCase.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.withMixedCase.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts deleted file mode 100644 index 3e792cbc8530..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.withUnderscores.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.withUnderscores.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index f7a345d3368a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../api/index.js"; -import type * as serializers from "../../../index.js"; - -const _BadObjectRequestInfo_Schema = z.object({ - message: z.string(), -}); -export const BadObjectRequestInfo: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.BadObjectRequestInfo; - json: (parsed: SeedExhaustive.BadObjectRequestInfo) => serializers.BadObjectRequestInfo.Raw; -} = { - _schema: _BadObjectRequestInfo_Schema, - parse: (raw: unknown) => _BadObjectRequestInfo_Schema.parse(raw) as SeedExhaustive.BadObjectRequestInfo, - json: (parsed: SeedExhaustive.BadObjectRequestInfo) => parsed as serializers.BadObjectRequestInfo.Raw, -}; - -export declare namespace BadObjectRequestInfo { - export interface Raw { - message: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts deleted file mode 100644 index 20b614a89e2f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index afdc575ededd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,40 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../api/index.js"; -import type * as serializers from "../../../../index.js"; -import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; - -const _PostWithObjectBody_Schema = z - .object({ - string: z.string(), - integer: z.number(), - NestedObject: ObjectWithOptionalField._schema, - }) - .transform((data) => ({ - string: data.string, - integer: data.integer, - nestedObject: data.NestedObject, - })); -export const PostWithObjectBody: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.PostWithObjectBody; - json: (parsed: SeedExhaustive.PostWithObjectBody) => serializers.PostWithObjectBody.Raw; -} = { - _schema: _PostWithObjectBody_Schema, - parse: (raw: unknown) => _PostWithObjectBody_Schema.parse(raw) as SeedExhaustive.PostWithObjectBody, - json: (parsed: SeedExhaustive.PostWithObjectBody) => - ({ - string: parsed.string, - integer: parsed.integer, - NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), - }) as serializers.PostWithObjectBody.Raw, -}; - -export declare namespace PostWithObjectBody { - export interface Raw { - string: string; - integer: number; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index d62a81ce61fd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts deleted file mode 100644 index 549edcdba7f2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts deleted file mode 100644 index 7c8d3bf63cc1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../index.js"; - -const _Response_Schema = z.boolean(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.noAuth.postWithNoAuth.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.noAuth.postWithNoAuth.Response.Raw, -}; - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts deleted file mode 100644 index b62616349ec6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts deleted file mode 100644 index 5880dd1a7111..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.noReqBody.postWithNoRequestBody.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.noReqBody.postWithNoRequestBody.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts deleted file mode 100644 index f3d5598805ba..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.reqWithHeaders.getWithCustomHeader.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.reqWithHeaders.getWithCustomHeader.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index fb7f25afb170..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index fda1be806c19..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithDocs_Schema = z.object({ - string: z.string(), -}); -export const ObjectWithDocs: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithDocs; - json: (parsed: SeedExhaustive.types.ObjectWithDocs) => serializers.types.ObjectWithDocs.Raw; -} = { - _schema: _ObjectWithDocs_Schema, - parse: (raw: unknown) => _ObjectWithDocs_Schema.parse(raw) as SeedExhaustive.types.ObjectWithDocs, - json: (parsed: SeedExhaustive.types.ObjectWithDocs) => parsed as serializers.types.ObjectWithDocs.Raw, -}; - -export declare namespace ObjectWithDocs { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index feebc1f6a916..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _WeatherReport_Schema = z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); -export const WeatherReport: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.WeatherReport; - json: (parsed: SeedExhaustive.types.WeatherReport) => serializers.types.WeatherReport.Raw; -} = { - _schema: _WeatherReport_Schema, - parse: (raw: unknown) => _WeatherReport_Schema.parse(raw) as SeedExhaustive.types.WeatherReport, - json: (parsed: SeedExhaustive.types.WeatherReport) => parsed as serializers.types.WeatherReport.Raw, -}; - -export declare namespace WeatherReport { - export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts deleted file mode 100644 index 52175f3cee16..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index a68dc56bdfba..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { OptionalAlias } from "./OptionalAlias.js"; - -const _DoubleOptional_Schema = z.object({ - optionalAlias: OptionalAlias._schema.optional(), -}); -export const DoubleOptional: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.DoubleOptional; - json: (parsed: SeedExhaustive.types.DoubleOptional) => serializers.types.DoubleOptional.Raw; -} = { - _schema: _DoubleOptional_Schema, - parse: (raw: unknown) => _DoubleOptional_Schema.parse(raw) as SeedExhaustive.types.DoubleOptional, - json: (parsed: SeedExhaustive.types.DoubleOptional) => - ({ - optionalAlias: - parsed.optionalAlias != null - ? parsed.optionalAlias != null - ? OptionalAlias.json(parsed.optionalAlias) - : parsed.optionalAlias - : parsed.optionalAlias, - }) as serializers.types.DoubleOptional.Raw, -}; - -export declare namespace DoubleOptional { - export interface Raw { - optionalAlias?: (OptionalAlias.Raw | undefined) | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index c90be8618d11..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,44 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -const _NestedObjectWithOptionalField_Schema = z - .object({ - string: z.string().optional(), - NestedObject: ObjectWithOptionalField._schema.optional(), - }) - .transform((data) => ({ - string: data.string, - nestedObject: data.NestedObject, - })); -export const NestedObjectWithOptionalField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithOptionalField; - json: ( - parsed: SeedExhaustive.types.NestedObjectWithOptionalField, - ) => serializers.types.NestedObjectWithOptionalField.Raw; -} = { - _schema: _NestedObjectWithOptionalField_Schema, - parse: (raw: unknown) => - _NestedObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithOptionalField, - json: (parsed: SeedExhaustive.types.NestedObjectWithOptionalField) => - ({ - string: parsed.string, - NestedObject: - parsed.nestedObject != null - ? parsed.nestedObject != null - ? ObjectWithOptionalField.json(parsed.nestedObject) - : parsed.nestedObject - : parsed.nestedObject, - }) as serializers.types.NestedObjectWithOptionalField.Raw, -}; - -export declare namespace NestedObjectWithOptionalField { - export interface Raw { - string?: string | null; - NestedObject?: ObjectWithOptionalField.Raw | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index ef7b8353d527..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -const _NestedObjectWithRequiredField_Schema = z - .object({ - string: z.string(), - NestedObject: ObjectWithOptionalField._schema, - }) - .transform((data) => ({ - string: data.string, - nestedObject: data.NestedObject, - })); -export const NestedObjectWithRequiredField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField; - json: ( - parsed: SeedExhaustive.types.NestedObjectWithRequiredField, - ) => serializers.types.NestedObjectWithRequiredField.Raw; -} = { - _schema: _NestedObjectWithRequiredField_Schema, - parse: (raw: unknown) => - _NestedObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField, - json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField) => - ({ - string: parsed.string, - NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), - }) as serializers.types.NestedObjectWithRequiredField.Raw, -}; - -export declare namespace NestedObjectWithRequiredField { - export interface Raw { - string: string; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index 714c7594bacd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithMapOfMap_Schema = z.object({ - map: z.record(z.string(), z.record(z.string(), z.string())), -}); -export const ObjectWithMapOfMap: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithMapOfMap; - json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => serializers.types.ObjectWithMapOfMap.Raw; -} = { - _schema: _ObjectWithMapOfMap_Schema, - parse: (raw: unknown) => _ObjectWithMapOfMap_Schema.parse(raw) as SeedExhaustive.types.ObjectWithMapOfMap, - json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => parsed as serializers.types.ObjectWithMapOfMap.Raw, -}; - -export declare namespace ObjectWithMapOfMap { - export interface Raw { - map: Record>; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 29084d0e7dc7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,74 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithOptionalField_Schema = z.object({ - string: z.string().optional(), - integer: z.number().optional(), - long: z.number().optional(), - double: z.number().optional(), - bool: z.boolean().optional(), - datetime: z - .string() - .transform((s) => new Date(s)) - .optional(), - date: z.string().optional(), - uuid: z.string().optional(), - base64: z.string().optional(), - list: z.array(z.string()).optional(), - set: z - .array(z.string()) - .transform((arr) => new Set(arr)) - .optional(), - map: z.record(z.string(), z.string()).optional(), - bigint: z.string().optional(), -}); -export const ObjectWithOptionalField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithOptionalField; - json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => serializers.types.ObjectWithOptionalField.Raw; -} = { - _schema: _ObjectWithOptionalField_Schema, - parse: (raw: unknown) => _ObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithOptionalField, - json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => - ({ - string: parsed.string, - integer: parsed.integer, - long: parsed.long, - double: parsed.double, - bool: parsed.bool, - datetime: - parsed.datetime != null - ? parsed.datetime != null - ? parsed.datetime.toISOString() - : parsed.datetime - : parsed.datetime, - date: parsed.date, - uuid: parsed.uuid, - base64: parsed.base64, - list: parsed.list, - set: parsed.set != null ? (parsed.set != null ? Array.from(parsed.set) : parsed.set) : parsed.set, - map: parsed.map, - bigint: parsed.bigint, - }) as serializers.types.ObjectWithOptionalField.Raw, -}; - -export declare namespace ObjectWithOptionalField { - export interface Raw { - string?: string | null; - integer?: number | null; - long?: number | null; - double?: number | null; - bool?: boolean | null; - datetime?: string | null; - date?: string | null; - uuid?: string | null; - base64?: string | null; - list?: string[] | null; - set?: string[] | null; - map?: Record | null; - bigint?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index a721771913f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithRequiredField_Schema = z.object({ - string: z.string(), -}); -export const ObjectWithRequiredField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField; - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => serializers.types.ObjectWithRequiredField.Raw; -} = { - _schema: _ObjectWithRequiredField_Schema, - parse: (raw: unknown) => _ObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField, - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => - parsed as serializers.types.ObjectWithRequiredField.Raw, -}; - -export declare namespace ObjectWithRequiredField { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index a243622f1ee5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _OptionalAlias_Schema = z.string().optional(); -export const OptionalAlias: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.OptionalAlias; - json: (parsed: SeedExhaustive.types.OptionalAlias) => serializers.types.OptionalAlias.Raw; -} = { - _schema: _OptionalAlias_Schema, - parse: (raw: unknown) => _OptionalAlias_Schema.parse(raw) as SeedExhaustive.types.OptionalAlias, - json: (parsed: SeedExhaustive.types.OptionalAlias) => parsed as serializers.types.OptionalAlias.Raw, -}; - -export declare namespace OptionalAlias { - export type Raw = string | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index 91b493ad4f9a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Cat } from "./Cat.js"; -import { Dog } from "./Dog.js"; - -const _Animal_Schema = z - .discriminatedUnion("animal", [ - z.object({ animal: z.literal("dog") }).merge(Dog._schema as z.AnyZodObject), - z.object({ animal: z.literal("cat") }).merge(Cat._schema as z.AnyZodObject), - ]) - .transform((value) => value); -export const Animal: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.Animal; - json: (parsed: SeedExhaustive.types.Animal) => serializers.types.Animal.Raw; -} = { - _schema: _Animal_Schema, - parse: (raw: unknown) => _Animal_Schema.parse(raw) as SeedExhaustive.types.Animal, - json: (parsed: SeedExhaustive.types.Animal) => parsed as serializers.types.Animal.Raw, -}; - -export declare namespace Animal { - export type Raw = Animal.Dog | Animal.Cat; - - export interface Dog extends Dog.Raw { - animal: "dog"; - } - - export interface Cat extends Cat.Raw { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index 0d6da57ce642..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _Cat_Schema = z.object({ - name: z.string(), - likesToMeow: z.boolean(), -}); -export const Cat: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.Cat; - json: (parsed: SeedExhaustive.types.Cat) => serializers.types.Cat.Raw; -} = { - _schema: _Cat_Schema, - parse: (raw: unknown) => _Cat_Schema.parse(raw) as SeedExhaustive.types.Cat, - json: (parsed: SeedExhaustive.types.Cat) => parsed as serializers.types.Cat.Raw, -}; - -export declare namespace Cat { - export interface Raw { - name: string; - likesToMeow: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 0547a8bc7e85..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _Dog_Schema = z.object({ - name: z.string(), - likesToWoof: z.boolean(), -}); -export const Dog: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.Dog; - json: (parsed: SeedExhaustive.types.Dog) => serializers.types.Dog.Raw; -} = { - _schema: _Dog_Schema, - parse: (raw: unknown) => _Dog_Schema.parse(raw) as SeedExhaustive.types.Dog, - json: (parsed: SeedExhaustive.types.Dog) => parsed as serializers.types.Dog.Raw, -}; - -export declare namespace Dog { - export interface Raw { - name: string; - likesToWoof: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts deleted file mode 100644 index b643a3e3ea27..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts +++ /dev/null @@ -1 +0,0 @@ -export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts deleted file mode 100644 index 7f5e031c8396..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This is a custom test file, if you wish to add more tests - * to your SDK. - * Be sure to mark this file in `.fernignore`. - * - * If you include example requests/responses in your fern definition, - * you will have tests automatically generated for you. - */ -describe("test", () => { - it("default", () => { - expect(true).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts deleted file mode 100644 index 954872157d52..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { RequestHandlerOptions } from "msw"; -import type { SetupServer } from "msw/node"; - -import { mockEndpointBuilder } from "./mockEndpointBuilder"; - -export interface MockServerOptions { - baseUrl: string; - server: SetupServer; -} - -export class MockServer { - private readonly server: SetupServer; - public readonly baseUrl: string; - - constructor({ baseUrl, server }: MockServerOptions) { - this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; - this.server = server; - } - - public mockEndpoint(options?: RequestHandlerOptions): ReturnType { - const builder = mockEndpointBuilder({ - once: options?.once ?? true, - onBuild: (handler) => { - this.server.use(handler); - }, - }).baseUrl(this.baseUrl); - return builder; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts deleted file mode 100644 index e1a90f7fb2e3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { setupServer } from "msw/node"; - -import { fromJson, toJson } from "../../src/core/json"; -import { MockServer } from "./MockServer"; -import { randomBaseUrl } from "./randomBaseUrl"; - -const mswServer = setupServer(); -interface MockServerOptions { - baseUrl?: string; -} - -async function formatHttpRequest(request: Request, id?: string): Promise { - try { - const clone = request.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Request ${id} ###\n` : ""; - const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting request: ${e}`; - } -} - -async function formatHttpResponse(response: Response, id?: string): Promise { - try { - const clone = response.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Response for ${id} ###\n` : ""; - const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting response: ${e}`; - } -} - -class MockServerPool { - private servers: MockServer[] = []; - - public createServer(options?: Partial): MockServer { - const baseUrl = options?.baseUrl || randomBaseUrl(); - const server = new MockServer({ baseUrl, server: mswServer }); - this.servers.push(server); - return server; - } - - public getServers(): MockServer[] { - return [...this.servers]; - } - - public listen(): void { - const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; - mswServer.listen({ onUnhandledRequest }); - - if (process.env.LOG_LEVEL === "debug") { - mswServer.events.on("request:start", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:start\n${formattedRequest}`); - }); - - mswServer.events.on("request:unhandled", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:unhandled\n${formattedRequest}`); - }); - - mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { - const formattedResponse = await formatHttpResponse(response, requestId); - console.debug(`response:mocked\n${formattedResponse}`); - }); - } - } - - public close(): void { - this.servers = []; - mswServer.close(); - } -} - -export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts deleted file mode 100644 index 1b0e51079e6b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; - -import { url } from "../../src/core"; -import { toJson } from "../../src/core/json"; -import { withFormUrlEncoded } from "./withFormUrlEncoded"; -import { withHeaders } from "./withHeaders"; -import { withJson } from "./withJson"; - -type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; - -interface MethodStage { - baseUrl(baseUrl: string): MethodStage; - all(path: string): RequestHeadersStage; - get(path: string): RequestHeadersStage; - post(path: string): RequestHeadersStage; - put(path: string): RequestHeadersStage; - delete(path: string): RequestHeadersStage; - patch(path: string): RequestHeadersStage; - options(path: string): RequestHeadersStage; - head(path: string): RequestHeadersStage; -} - -interface RequestHeadersStage extends RequestBodyStage, ResponseStage { - header(name: string, value: string): RequestHeadersStage; - headers(headers: Record): RequestBodyStage; -} - -interface RequestBodyStage extends ResponseStage { - jsonBody(body: unknown): ResponseStage; - formUrlEncodedBody(body: unknown): ResponseStage; -} - -interface ResponseStage { - respondWith(): ResponseStatusStage; -} -interface ResponseStatusStage { - statusCode(statusCode: number): ResponseHeaderStage; -} - -interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { - header(name: string, value: string): ResponseHeaderStage; - headers(headers: Record): ResponseHeaderStage; -} - -interface ResponseBodyStage { - jsonBody(body: unknown): BuildStage; -} - -interface BuildStage { - build(): HttpHandler; -} - -export interface HttpHandlerBuilderOptions { - onBuild?: (handler: HttpHandler) => void; - once?: boolean; -} - -class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { - private method: HttpMethod = "get"; - private _baseUrl: string = ""; - private path: string = "/"; - private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - constructor(options?: HttpHandlerBuilderOptions) { - this.handlerOptions = options; - } - - baseUrl(baseUrl: string): MethodStage { - this._baseUrl = baseUrl; - return this; - } - - all(path: string): RequestHeadersStage { - this.method = "all"; - this.path = path; - return this; - } - - get(path: string): RequestHeadersStage { - this.method = "get"; - this.path = path; - return this; - } - - post(path: string): RequestHeadersStage { - this.method = "post"; - this.path = path; - return this; - } - - put(path: string): RequestHeadersStage { - this.method = "put"; - this.path = path; - return this; - } - - delete(path: string): RequestHeadersStage { - this.method = "delete"; - this.path = path; - return this; - } - - patch(path: string): RequestHeadersStage { - this.method = "patch"; - this.path = path; - return this; - } - - options(path: string): RequestHeadersStage { - this.method = "options"; - this.path = path; - return this; - } - - head(path: string): RequestHeadersStage { - this.method = "head"; - this.path = path; - return this; - } - - header(name: string, value: string): RequestHeadersStage { - this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); - return this; - } - - headers(headers: Record): RequestBodyStage { - this.predicates.push((resolver) => withHeaders(headers, resolver)); - return this; - } - - jsonBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); - } - this.predicates.push((resolver) => withJson(body, resolver)); - return this; - } - - formUrlEncodedBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error( - "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", - ); - } - this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); - return this; - } - - respondWith(): ResponseStatusStage { - return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); - } - - private buildUrl(): string { - return url.join(this._baseUrl, this.path); - } -} - -class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { - private readonly method: HttpMethod; - private readonly url: string; - private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - private responseStatusCode: number = 200; - private responseHeaders: Record = {}; - private responseBody: DefaultBodyType = undefined; - - constructor( - method: HttpMethod, - url: string, - requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], - options?: HttpHandlerBuilderOptions, - ) { - this.method = method; - this.url = url; - this.requestPredicates = requestPredicates; - this.handlerOptions = options; - } - - public statusCode(code: number): ResponseHeaderStage { - this.responseStatusCode = code; - return this; - } - - public header(name: string, value: string): ResponseHeaderStage { - this.responseHeaders[name] = value; - return this; - } - - public headers(headers: Record): ResponseHeaderStage { - this.responseHeaders = { ...this.responseHeaders, ...headers }; - return this; - } - - public jsonBody(body: unknown): BuildStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); - } - this.responseBody = toJson(body); - return this; - } - - public build(): HttpHandler { - const responseResolver: HttpResponseResolver = () => { - const response = new HttpResponse(this.responseBody, { - status: this.responseStatusCode, - headers: this.responseHeaders, - }); - // if no Content-Type header is set, delete the default text content type that is set - if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { - response.headers.delete("Content-Type"); - } - return response; - }; - - const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); - - const handler = http[this.method](this.url, finalResolver, this.handlerOptions); - this.handlerOptions?.onBuild?.(handler); - return handler; - } -} - -export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { - return new RequestBuilder(options); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts deleted file mode 100644 index 031aa6408aca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function randomBaseUrl(): string { - const randomString = Math.random().toString(36).substring(2, 15); - return `http://${randomString}.localhost`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts deleted file mode 100644 index aeb3a95af7dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { afterAll, beforeAll } from "vitest"; - -import { mockServerPool } from "./MockServerPool"; - -beforeAll(() => { - mockServerPool.listen(); -}); -afterAll(() => { - mockServerPool.close(); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts deleted file mode 100644 index e9e6ff2d9cf1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: Record; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a form-urlencoded body."); - return passthrough(); - } - const params = new URLSearchParams(bodyText); - actualBody = {}; - for (const [key, value] of params.entries()) { - actualBody[key] = value; - } - } catch (error) { - console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).length > 0) { - console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - return { value: { actual, expected } }; - } - return {}; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if (actual[key] !== expected[key]) { - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts deleted file mode 100644 index 6599d2b4a92d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -/** - * Creates a request matcher that validates if request headers match specified criteria - * @param expectedHeaders - Headers to match against - * @param resolver - Response resolver to execute if headers match - */ -export function withHeaders( - expectedHeaders: Record boolean)>, - resolver: HttpResponseResolver, -): HttpResponseResolver { - return (args) => { - const { request } = args; - const { headers } = request; - - const mismatches: Record< - string, - { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } - > = {}; - - for (const [key, expectedValue] of Object.entries(expectedHeaders)) { - const actualValue = headers.get(key); - - if (actualValue === null) { - mismatches[key] = { actual: null, expected: expectedValue }; - continue; - } - - if (typeof expectedValue === "function") { - if (!expectedValue(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue instanceof RegExp) { - if (!expectedValue.test(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue !== actualValue) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } - - if (Object.keys(mismatches).length > 0) { - const formattedMismatches = formatHeaderMismatches(mismatches); - console.error("Header mismatch:", formattedMismatches); - return passthrough(); - } - - return resolver(args); - }; -} - -function formatHeaderMismatches( - mismatches: Record boolean) }>, -): Record { - const formatted: Record = {}; - - for (const [key, { actual, expected }] of Object.entries(mismatches)) { - formatted[key] = { - actual, - expected: - expected instanceof RegExp - ? expected.toString() - : typeof expected === "function" - ? "[Function]" - : expected, - }; - } - - return formatted; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts deleted file mode 100644 index b627638b015f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { fromJson, toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request JSON body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: unknown; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a JSON object."); - return passthrough(); - } - actualBody = fromJson(bodyText); - } catch (error) { - console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { - console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - return {}; - } - - if (Array.isArray(actual) && Array.isArray(expected)) { - if (actual.length !== expected.length) { - return { length: { actual: actual.length, expected: expected.length } }; - } - - const arrayMismatches: Record = {}; - for (let i = 0; i < actual.length; i++) { - const itemMismatches = findMismatches(actual[i], expected[i]); - if (Object.keys(itemMismatches).length > 0) { - for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { - arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; - } - } - } - return arrayMismatches; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; // Skip undefined values in actual - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; // Skip undefined values in expected - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if ( - typeof actual[key] === "object" && - actual[key] !== null && - typeof expected[key] === "object" && - expected[key] !== null - ) { - const nestedMismatches = findMismatches(actual[key], expected[key]); - if (Object.keys(nestedMismatches).length > 0) { - for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { - mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; - } - } - } else if (actual[key] !== expected[key]) { - if (areEquivalent(actual[key], expected[key])) { - continue; - } - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} - -function areEquivalent(actual: unknown, expected: unknown): boolean { - if (actual === expected) { - return true; - } - if (isEquivalentBigInt(actual, expected)) { - return true; - } - if (isEquivalentDatetime(actual, expected)) { - return true; - } - return false; -} - -function isEquivalentBigInt(actual: unknown, expected: unknown) { - if (typeof actual === "number") { - actual = BigInt(actual); - } - if (typeof expected === "number") { - expected = BigInt(expected); - } - if (typeof actual === "bigint" && typeof expected === "bigint") { - return actual === expected; - } - return false; -} - -function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { - if (typeof str1 !== "string" || typeof str2 !== "string") { - return false; - } - const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; - if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { - return false; - } - - try { - const date1 = new Date(str1).getTime(); - const date2 = new Date(str2).getTime(); - return date1 === date2; - } catch { - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts deleted file mode 100644 index a5651f81ba10..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { expect } from "vitest"; - -interface CustomMatchers { - toContainHeaders(expectedHeaders: Record): R; -} - -declare module "vitest" { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} - -expect.extend({ - toContainHeaders(actual: unknown, expectedHeaders: Record) { - const isHeaders = actual instanceof Headers; - const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); - - if (!isHeaders && !isPlainObject) { - throw new TypeError("Received value must be an instance of Headers or a plain object!"); - } - - if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { - throw new TypeError("Expected headers must be a plain object!"); - } - - const missingHeaders: string[] = []; - const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; - - for (const [key, value] of Object.entries(expectedHeaders)) { - let actualValue: string | null = null; - - if (isHeaders) { - // Headers.get() is already case-insensitive - actualValue = (actual as Headers).get(key); - } else { - // For plain objects, do case-insensitive lookup - const actualObj = actual as Record; - const lowerKey = key.toLowerCase(); - const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); - actualValue = foundKey ? actualObj[foundKey] : null; - } - - if (actualValue === null || actualValue === undefined) { - missingHeaders.push(key); - } else if (actualValue !== value) { - mismatchedHeaders.push({ key, expected: value, actual: actualValue }); - } - } - - const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; - - const actualType = isHeaders ? "Headers" : "object"; - - if (pass) { - return { - message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, - pass: true, - }; - } else { - const messages: string[] = []; - - if (missingHeaders.length > 0) { - messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); - } - - if (mismatchedHeaders.length > 0) { - const mismatches = mismatchedHeaders.map( - ({ key, expected, actual }) => - `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, - ); - messages.push(mismatches.join("\n")); - } - - return { - message: () => - `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, - pass: false, - }; - } - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json deleted file mode 100644 index a477df47920c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": null, - "rootDir": "..", - "baseUrl": "..", - "types": ["vitest/globals"] - }, - "include": ["../src", "../tests"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts deleted file mode 100644 index 9b5123364c47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { BasicAuth } from "../../../src/core/auth/BasicAuth"; - -describe("BasicAuth", () => { - interface ToHeaderTestCase { - description: string; - input: { username: string; password: string }; - expected: string; - } - - interface FromHeaderTestCase { - description: string; - input: string; - expected: { username: string; password: string }; - } - - interface ErrorTestCase { - description: string; - input: string; - expectedError: string; - } - - describe("toAuthorizationHeader", () => { - const toHeaderTests: ToHeaderTestCase[] = [ - { - description: "correctly converts to header", - input: { username: "username", password: "password" }, - expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - }, - ]; - - toHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); - }); - }); - }); - - describe("fromAuthorizationHeader", () => { - const fromHeaderTests: FromHeaderTestCase[] = [ - { - description: "correctly parses header", - input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - expected: { username: "username", password: "password" }, - }, - { - description: "handles password with colons", - input: "Basic dXNlcjpwYXNzOndvcmQ=", - expected: { username: "user", password: "pass:word" }, - }, - { - description: "handles empty username and password (just colon)", - input: "Basic Og==", - expected: { username: "", password: "" }, - }, - { - description: "handles empty username", - input: "Basic OnBhc3N3b3Jk", - expected: { username: "", password: "password" }, - }, - { - description: "handles empty password", - input: "Basic dXNlcm5hbWU6", - expected: { username: "username", password: "" }, - }, - ]; - - fromHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); - }); - }); - - const errorTests: ErrorTestCase[] = [ - { - description: "throws error for completely empty credentials", - input: "Basic ", - expectedError: "Invalid basic auth", - }, - { - description: "throws error for credentials without colon", - input: "Basic dXNlcm5hbWU=", - expectedError: "Invalid basic auth", - }, - ]; - - errorTests.forEach(({ description, input, expectedError }) => { - it(description, () => { - expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts deleted file mode 100644 index 7757b87cb97e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BearerToken } from "../../../src/core/auth/BearerToken"; - -describe("BearerToken", () => { - describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); - }); - }); - describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts deleted file mode 100644 index 939594ca277b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { base64Decode, base64Encode } from "../../src/core/base64"; - -describe("base64", () => { - describe("base64Encode", () => { - it("should encode ASCII strings", () => { - expect(base64Encode("hello")).toBe("aGVsbG8="); - expect(base64Encode("")).toBe(""); - }); - - it("should encode UTF-8 strings", () => { - expect(base64Encode("café")).toBe("Y2Fmw6k="); - expect(base64Encode("🎉")).toBe("8J+OiQ=="); - }); - - it("should handle basic auth credentials", () => { - expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); - }); - }); - - describe("base64Decode", () => { - it("should decode ASCII strings", () => { - expect(base64Decode("aGVsbG8=")).toBe("hello"); - expect(base64Decode("")).toBe(""); - }); - - it("should decode UTF-8 strings", () => { - expect(base64Decode("Y2Fmw6k=")).toBe("café"); - expect(base64Decode("8J+OiQ==")).toBe("🎉"); - }); - - it("should handle basic auth credentials", () => { - expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); - }); - }); - - describe("round-trip encoding", () => { - const testStrings = [ - "hello world", - "test@example.com", - "café", - "username:password", - "user@domain.com:super$ecret123!", - ]; - - testStrings.forEach((testString) => { - it(`should round-trip encode/decode: "${testString}"`, () => { - const encoded = base64Encode(testString); - const decoded = base64Decode(encoded); - expect(decoded).toBe(testString); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts deleted file mode 100644 index 60df2b5e4824..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts +++ /dev/null @@ -1,261 +0,0 @@ -import fs from "fs"; -import { join } from "path"; -import stream from "stream"; -import type { BinaryResponse } from "../../../src/core"; -import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -describe("Test fetcherImpl", () => { - it("should handle successful request", async () => { - const mockArgs: Fetcher.Args = { - url: "https://httpbin.org/post", - method: "POST", - headers: { "X-Test": "x-test-header" }, - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - maxRetries: 0, - responseType: "json", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - - expect(global.fetch).toHaveBeenCalledWith( - "https://httpbin.org/post", - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: JSON.stringify({ data: "test" }), - }), - ); - }); - - it("should send octet stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "POST", - headers: { "X-Test": "x-test-header" }, - contentType: "application/octet-stream", - requestType: "bytes", - maxRetries: 0, - responseType: "json", - body: fs.createReadStream(join(__dirname, "test-file.txt")), - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: expect.any(fs.ReadStream), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - }); - - it("should receive file as stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.stream).toBe("function"); - const stream = body.stream(); - expect(stream).toBeInstanceOf(ReadableStream); - const reader = stream.getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as blob", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.blob).toBe("function"); - const blob = await body.blob(); - expect(blob).toBeInstanceOf(Blob); - const reader = blob.stream().getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as arraybuffer", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.arrayBuffer).toBe("function"); - const arrayBuffer = await body.arrayBuffer(); - expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as bytes", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.bytes).toBe("function"); - if (!body.bytes) { - return; - } - const bytes = await body.bytes(); - expect(bytes).toBeInstanceOf(Uint8Array); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(bytes); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts deleted file mode 100644 index 2ec008e581d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; - -import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; -import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("HttpResponsePromise", () => { - const mockRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - const mockData = { id: "123", name: "test" }; - const mockWithRawResponse: WithRawResponse = { - data: mockData, - rawResponse: mockRawResponse, - }; - - describe("fromFunction", () => { - it("should create an HttpResponsePromise from a function", async () => { - const mockFn = vi - .fn<(arg1: string, arg2: string) => Promise>>() - .mockResolvedValue(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); - - const result = await responsePromise; - expect(result).toEqual(mockData); - expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromPromise", () => { - it("should create an HttpResponsePromise from a promise", async () => { - const promise = Promise.resolve(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromPromise(promise); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromExecutor", () => { - it("should create an HttpResponsePromise from an executor function", async () => { - const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { - resolve(mockWithRawResponse); - }); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromResult", () => { - it("should create an HttpResponsePromise from a result", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("Promise methods", () => { - let responsePromise: HttpResponsePromise; - - beforeEach(() => { - responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - }); - - it("should support then() method", async () => { - const result = await responsePromise.then((data) => ({ - ...data, - modified: true, - })); - - expect(result).toEqual({ - ...mockData, - modified: true, - }); - }); - - it("should support catch() method", async () => { - const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { - reject(new Error("Test error")); - }); - - const catchSpy = vi.fn(); - await errorResponsePromise.catch(catchSpy); - - expect(catchSpy).toHaveBeenCalled(); - const error = catchSpy.mock.calls[0]?.[0]; - expect(error).toBeInstanceOf(Error); - expect((error as Error).message).toBe("Test error"); - }); - - it("should support finally() method", async () => { - const finallySpy = vi.fn(); - await responsePromise.finally(finallySpy); - - expect(finallySpy).toHaveBeenCalled(); - }); - }); - - describe("withRawResponse", () => { - it("should return both data and raw response", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise.withRawResponse(); - - expect(result).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts deleted file mode 100644 index 375ee3f38064..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("RawResponse", () => { - describe("toRawResponse", () => { - it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { - const mockHeaders = new Headers({ "content-type": "application/json" }); - const mockResponse = { - body: "test body", - bodyUsed: false, - ok: true, - headers: mockHeaders, - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - - const result = toRawResponse(mockResponse as unknown as Response); - - expect("body" in result).toBe(false); - expect("bodyUsed" in result).toBe(false); - expect("ok" in result).toBe(false); - expect(result.headers).toBe(mockHeaders); - expect(result.redirected).toBe(false); - expect(result.status).toBe(200); - expect(result.statusText).toBe("OK"); - expect(result.type).toBe("basic"); - expect(result.url).toBe("https://example.com"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts deleted file mode 100644 index a92f1b5e81d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; - -describe("Test createRequestUrl", () => { - const BASE_URL = "https://api.example.com"; - - interface TestCase { - description: string; - baseUrl: string; - queryParams?: Record; - expected: string; - } - - const testCases: TestCase[] = [ - { - description: "should return the base URL when no query parameters are provided", - baseUrl: BASE_URL, - expected: BASE_URL, - }, - { - description: "should append simple query parameters", - baseUrl: BASE_URL, - queryParams: { key: "value", another: "param" }, - expected: "https://api.example.com?key=value&another=param", - }, - { - description: "should handle array query parameters", - baseUrl: BASE_URL, - queryParams: { items: ["a", "b", "c"] }, - expected: "https://api.example.com?items=a&items=b&items=c", - }, - { - description: "should handle object query parameters", - baseUrl: BASE_URL, - queryParams: { filter: { name: "John", age: 30 } }, - expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", - }, - { - description: "should handle mixed types of query parameters", - baseUrl: BASE_URL, - queryParams: { - simple: "value", - array: ["x", "y"], - object: { key: "value" }, - }, - expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", - }, - { - description: "should handle empty query parameters object", - baseUrl: BASE_URL, - queryParams: {}, - expected: BASE_URL, - }, - { - description: "should encode special characters in query parameters", - baseUrl: BASE_URL, - queryParams: { special: "a&b=c d" }, - expected: "https://api.example.com?special=a%26b%3Dc%20d", - }, - { - description: "should handle numeric values", - baseUrl: BASE_URL, - queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, - expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", - }, - { - description: "should handle boolean values", - baseUrl: BASE_URL, - queryParams: { enabled: true, disabled: false }, - expected: "https://api.example.com?enabled=true&disabled=false", - }, - { - description: "should handle null and undefined values", - baseUrl: BASE_URL, - queryParams: { - valid: "value", - nullValue: null, - undefinedValue: undefined, - emptyString: "", - }, - expected: "https://api.example.com?valid=value&nullValue=&emptyString=", - }, - { - description: "should handle deeply nested objects", - baseUrl: BASE_URL, - queryParams: { - user: { - profile: { - name: "John", - settings: { theme: "dark" }, - }, - }, - }, - expected: - "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle arrays of objects", - baseUrl: BASE_URL, - queryParams: { - users: [ - { name: "John", age: 30 }, - { name: "Jane", age: 25 }, - ], - }, - expected: - "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", - }, - { - description: "should handle mixed arrays", - baseUrl: BASE_URL, - queryParams: { - mixed: ["string", 42, true, { key: "value" }], - }, - expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", - }, - { - description: "should handle empty arrays", - baseUrl: BASE_URL, - queryParams: { emptyArray: [] }, - expected: BASE_URL, - }, - { - description: "should handle empty objects", - baseUrl: BASE_URL, - queryParams: { emptyObject: {} }, - expected: BASE_URL, - }, - { - description: "should handle special characters in keys", - baseUrl: BASE_URL, - queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, - expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", - }, - { - description: "should handle URL with existing query parameters", - baseUrl: "https://api.example.com?existing=param", - queryParams: { new: "value" }, - expected: "https://api.example.com?existing=param?new=value", - }, - { - description: "should handle complex nested structures", - baseUrl: BASE_URL, - queryParams: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - ]; - - testCases.forEach(({ description, baseUrl, queryParams, expected }) => { - it(description, () => { - expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts deleted file mode 100644 index 8a6c3a57e211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getRequestBody", () => { - interface TestCase { - description: string; - input: any; - type: "json" | "form" | "file" | "bytes" | "other"; - expected: any; - skipCondition?: () => boolean; - } - - const testCases: TestCase[] = [ - { - description: "should stringify body if not FormData in Node environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "node", - }, - { - description: "should stringify body if not FormData in browser environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "browser", - }, - { - description: "should return the Uint8Array", - input: new Uint8Array([1, 2, 3]), - type: "bytes", - expected: new Uint8Array([1, 2, 3]), - }, - { - description: "should serialize objects for form-urlencoded content type", - input: { username: "johndoe", email: "john@example.com" }, - type: "form", - expected: "username=johndoe&email=john%40example.com", - }, - { - description: "should serialize complex nested objects and arrays for form-urlencoded content type", - input: { - user: { - profile: { - name: "John Doe", - settings: { - theme: "dark", - notifications: true, - }, - }, - tags: ["admin", "user"], - contacts: [ - { type: "email", value: "john@example.com" }, - { type: "phone", value: "+1234567890" }, - ], - }, - filters: { - status: ["active", "pending"], - metadata: { - created: "2024-01-01", - categories: ["electronics", "books"], - }, - }, - preferences: ["notifications", "updates"], - }, - type: "form", - expected: - "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + - "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + - "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + - "user%5Btags%5D=admin&" + - "user%5Btags%5D=user&" + - "user%5Bcontacts%5D%5Btype%5D=email&" + - "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + - "user%5Bcontacts%5D%5Btype%5D=phone&" + - "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + - "filters%5Bstatus%5D=active&" + - "filters%5Bstatus%5D=pending&" + - "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + - "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + - "filters%5Bmetadata%5D%5Bcategories%5D=books&" + - "preferences=notifications&" + - "preferences=updates", - }, - { - description: "should return the input for pre-serialized form-urlencoded strings", - input: "key=value&another=param", - type: "other", - expected: "key=value&another=param", - }, - { - description: "should JSON stringify objects", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - }, - ]; - - testCases.forEach(({ description, input, type, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const result = await getRequestBody({ - body: input, - type, - }); - - if (input instanceof Uint8Array) { - expect(result).toBe(input); - } else { - expect(result).toBe(expected); - } - }); - }); - - it("should return FormData in browser environment", async () => { - if (RUNTIME.type === "browser") { - const formData = new FormData(); - formData.append("key", "value"); - const result = await getRequestBody({ - body: formData, - type: "file", - }); - expect(result).toBe(formData); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts deleted file mode 100644 index ad6be7fc2c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; - -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getResponseBody", () => { - interface SimpleTestCase { - description: string; - responseData: string | Record; - responseType?: "blob" | "sse" | "streaming" | "text"; - expected: any; - skipCondition?: () => boolean; - } - - const simpleTestCases: SimpleTestCase[] = [ - { - description: "should handle text response type", - responseData: "test text", - responseType: "text", - expected: "test text", - }, - { - description: "should handle JSON response", - responseData: { key: "value" }, - expected: { key: "value" }, - }, - { - description: "should handle empty response", - responseData: "", - expected: undefined, - }, - { - description: "should handle non-JSON response", - responseData: "invalid json", - expected: { - ok: false, - error: { - reason: "non-json", - statusCode: 200, - rawBody: "invalid json", - }, - }, - }, - ]; - - simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const mockResponse = new Response( - typeof responseData === "string" ? responseData : JSON.stringify(responseData), - ); - const result = await getResponseBody(mockResponse, responseType); - expect(result).toEqual(expected); - }); - }); - - it("should handle blob response type", async () => { - const mockBlob = new Blob(["test"], { type: "text/plain" }); - const mockResponse = new Response(mockBlob); - const result = await getResponseBody(mockResponse, "blob"); - // @ts-expect-error - expect(result.constructor.name).toBe("Blob"); - }); - - it("should handle sse response type", async () => { - if (RUNTIME.type === "node") { - const mockStream = new ReadableStream(); - const mockResponse = new Response(mockStream); - const result = await getResponseBody(mockResponse, "sse"); - expect(result).toBe(mockStream); - } - }); - - it("should handle streaming response type", async () => { - const encoder = new TextEncoder(); - const testData = "test stream data"; - const mockStream = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode(testData)); - controller.close(); - }, - }); - - const mockResponse = new Response(mockStream); - const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; - - expect(result).toBeInstanceOf(ReadableStream); - - const reader = result.getReader(); - const decoder = new TextDecoder(); - const { value } = await reader.read(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe(testData); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts deleted file mode 100644 index 366c9b6ced61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts +++ /dev/null @@ -1,517 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Fetcher Logging Integration", () => { - describe("Request Logging", () => { - it("should log successful request at debug level", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - headers: { "Content-Type": "application/json" }, - body: { test: "data" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - }), - hasBody: true, - }), - ); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - statusCode: 200, - }), - ); - }); - - it("should not log debug messages at info level for successful requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "info", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - }); - - it("should log request with body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: true, - }), - ); - }); - - it("should log request without body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: false, - }), - ); - }); - - it("should not log when silent mode is enabled", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: true, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should not log when no logging config is provided", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Error Logging", () => { - it("should log 4xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Not found" }, 404, "Not Found"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 404, - }), - ); - }); - - it("should log 5xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 500, - }), - ); - }); - - it("should log aborted request errors", async () => { - const mockLogger = createMockLogger(); - - const abortController = new AbortController(); - abortController.abort(); - - global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - abortSignal: abortController.signal, - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request was aborted", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - }), - ); - }); - - it("should log timeout errors", async () => { - const mockLogger = createMockLogger(); - - const timeoutError = new Error("Request timeout"); - timeoutError.name = "AbortError"; - - global.fetch = vi.fn().mockRejectedValue(timeoutError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request timed out", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - timeoutMs: undefined, - }), - ); - }); - - it("should log unknown errors", async () => { - const mockLogger = createMockLogger(); - - const unknownError = new Error("Unknown error"); - - global.fetch = vi.fn().mockRejectedValue(unknownError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - errorMessage: "Unknown error", - }), - ); - }); - }); - - describe("Logging with Redaction", () => { - it("should redact sensitive data in error logs", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]", - }), - ); - }); - }); - - describe("Different HTTP Methods", () => { - it("should log GET requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "GET", - }), - ); - }); - - it("should log POST requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - }), - ); - }); - - it("should log PUT requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "PUT", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "PUT", - }), - ); - }); - - it("should log DELETE requests", async () => { - const mockLogger = createMockLogger(); - global.fetch = vi.fn().mockResolvedValue( - new Response(null, { - status: 200, - statusText: "OK", - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "DELETE", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "DELETE", - }), - ); - }); - }); - - describe("Status Code Logging", () => { - it("should log 2xx success status codes", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 201, - }), - ); - }); - - it("should log 3xx redirect status codes as success", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 301, - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts deleted file mode 100644 index ea49466a55fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Mock } from "vitest"; -import { makeRequest } from "../../../src/core/fetcher/makeRequest"; - -describe("Test makeRequest", () => { - const mockPostUrl = "https://httpbin.org/post"; - const mockGetUrl = "https://httpbin.org/get"; - const mockHeaders = { "Content-Type": "application/json" }; - const mockBody = JSON.stringify({ key: "value" }); - - let mockFetch: Mock; - - beforeEach(() => { - mockFetch = vi.fn(); - mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); - }); - - it("should handle POST request correctly", async () => { - const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockPostUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "POST", - headers: mockHeaders, - body: mockBody, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); - - it("should handle GET request correctly", async () => { - const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockGetUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "GET", - headers: mockHeaders, - body: undefined, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts deleted file mode 100644 index d599376b9bcf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts +++ /dev/null @@ -1,1115 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Redacting Logic", () => { - describe("Header Redaction", () => { - it("should redact authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Authorization: "Bearer secret-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - }), - }), - ); - }); - - it("should redact api-key header (case-insensitive)", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-API-KEY": "secret-api-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-API-KEY": "[REDACTED]", - }), - }), - ); - }); - - it("should redact cookie header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Cookie: "session=abc123; token=xyz789" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Cookie: "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-auth-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "x-auth-token": "auth-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "x-auth-token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact proxy-authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "Proxy-Authorization": "Basic credentials" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Proxy-Authorization": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-csrf-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-CSRF-Token": "csrf-token-abc" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-CSRF-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact www-authenticate header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "WWW-Authenticate": "Bearer realm=example" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "WWW-Authenticate": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-session-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-Session-Token": "session-token-xyz" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-Session-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive headers", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }), - }), - ); - }); - - it("should redact multiple sensitive headers at once", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - Authorization: "Bearer token", - "X-API-Key": "api-key", - Cookie: "session=123", - "Content-Type": "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - "X-API-Key": "[REDACTED]", - Cookie: "[REDACTED]", - "Content-Type": "application/json", - }), - }), - ); - }); - }); - - describe("Response Header Redaction", () => { - it("should redact Set-Cookie in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "set-cookie": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact authorization in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Authorization", "Bearer token-123"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - authorization: "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact response headers in error responses", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - statusText: "Unauthorized", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "www-authenticate": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - }); - - describe("Query Parameter Redaction", () => { - it("should redact api_key query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { api_key: "secret-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - api_key: "[REDACTED]", - }), - }), - ); - }); - - it("should redact token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact access_token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { access_token: "secret-access-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - access_token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact password query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { password: "secret-password" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - password: "[REDACTED]", - }), - }), - ); - }); - - it("should redact secret query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { secret: "secret-value" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - secret: "[REDACTED]", - }), - }), - ); - }); - - it("should redact session_id query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { session_id: "session-123" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - session_id: "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - page: "1", - limit: "10", - sort: "name", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - page: "1", - limit: "10", - sort: "name", - }), - }), - ); - }); - - it("should not redact parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - author: "john", - authenticate: "false", - authorization_level: "user", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - author: "john", - authenticate: "false", - authorization_level: "user", - }), - }), - ); - }); - - it("should handle undefined query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: undefined, - }), - ); - }); - - it("should redact case-insensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - API_KEY: "[REDACTED]", - Token: "[REDACTED]", - }), - }), - ); - }); - }); - - describe("URL Redaction", () => { - it("should redact credentials in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:password@example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api", - }), - ); - }); - - it("should redact api_key in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret-key&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&page=1", - }), - ); - }); - - it("should redact token in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret-token", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should redact password in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?username=user&password=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?username=user&password=[REDACTED]", - }), - ); - }); - - it("should not redact non-sensitive query strings", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name", - }), - ); - }); - - it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - }), - ); - }); - - it("should handle URL with fragment", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret#section", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]#section", - }), - ); - }); - - it("should redact URL-encoded query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api%5Fkey=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api%5Fkey=[REDACTED]", - }), - ); - }); - - it("should handle URL without query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api", - }), - ); - }); - - it("should handle empty query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?", - }), - ); - }); - - it("should redact multiple sensitive parameters in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret1&token=secret2&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", - }), - ); - }); - - it("should redact both credentials and query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/api?token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should use fast path for URLs without sensitive keywords", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - }), - ); - }); - - it("should handle query parameter without value", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?flag&token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?flag&token=[REDACTED]", - }), - ); - }); - - it("should handle URL with multiple @ symbols in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user@example.com:pass@host.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@host.com/api", - }), - ); - }); - - it("should handle URL with @ in query parameter but not in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?email=user@example.com", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?email=user@example.com", - }), - ); - }); - - it("should handle URL with both credentials and @ in path", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/users/@username", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/users/@username", - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts deleted file mode 100644 index d22661367f4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -import type { Mock, MockInstance } from "vitest"; -import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; - -describe("requestWithRetries", () => { - let mockFetch: Mock; - let originalMathRandom: typeof Math.random; - let setTimeoutSpy: MockInstance; - - beforeEach(() => { - mockFetch = vi.fn(); - originalMathRandom = Math.random; - - Math.random = vi.fn(() => 0.5); - - vi.useFakeTimers({ - toFake: [ - "setTimeout", - "clearTimeout", - "setInterval", - "clearInterval", - "setImmediate", - "clearImmediate", - "Date", - "performance", - "requestAnimationFrame", - "cancelAnimationFrame", - "requestIdleCallback", - "cancelIdleCallback", - ], - }); - }); - - afterEach(() => { - Math.random = originalMathRandom; - vi.clearAllMocks(); - vi.clearAllTimers(); - }); - - it("should retry on retryable status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const retryableStatuses = [408, 429, 500, 502]; - let callCount = 0; - - mockFetch.mockImplementation(async () => { - if (callCount < retryableStatuses.length) { - return new Response("", { status: retryableStatuses[callCount++] }); - } - return new Response("", { status: 200 }); - }); - - const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); - expect(response.status).toBe(200); - }); - - it("should respect maxRetries limit", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const maxRetries = 2; - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - expect(response.status).toBe(500); - }); - - it("should not retry on success status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const successStatuses = [200, 201, 202]; - - for (const status of successStatuses) { - mockFetch.mockReset(); - setTimeoutSpy.mockClear(); - mockFetch.mockResolvedValueOnce(new Response("", { status })); - - const responsePromise = requestWithRetries(() => mockFetch(), 3); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(1); - expect(setTimeoutSpy).not.toHaveBeenCalled(); - } - }); - - interface RetryHeaderTestCase { - description: string; - headerName: string; - headerValue: string | (() => string); - expectedDelayMin: number; - expectedDelayMax: number; - } - - const retryHeaderTests: RetryHeaderTestCase[] = [ - { - description: "should respect retry-after header with seconds value", - headerName: "retry-after", - headerValue: "5", - expectedDelayMin: 4000, - expectedDelayMax: 6000, - }, - { - description: "should respect retry-after header with HTTP date value", - headerName: "retry-after", - headerValue: () => new Date(Date.now() + 3000).toUTCString(), - expectedDelayMin: 2000, - expectedDelayMax: 4000, - }, - { - description: "should respect x-ratelimit-reset header", - headerName: "x-ratelimit-reset", - headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), - expectedDelayMin: 3000, - expectedDelayMax: 6000, - }, - ]; - - retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { - it(description, async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const value = typeof headerValue === "function" ? headerValue() : headerValue; - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ [headerName]: value }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(expectedDelayMin); - expect(actualDelay).toBeLessThan(expectedDelayMax); - expect(response.status).toBe(200); - }); - }); - - it("should apply correct exponential backoff with jitter", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - const maxRetries = 3; - const expectedDelays = [1000, 2000, 4000]; - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); - - expectedDelays.forEach((delay, index) => { - expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); - }); - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - }); - - it("should handle concurrent retries independently", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 200 })) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const promise1 = requestWithRetries(() => mockFetch(), 1); - const promise2 = requestWithRetries(() => mockFetch(), 1); - - await vi.runAllTimersAsync(); - const [response1, response2] = await Promise.all([promise1, promise2]); - - expect(response1.status).toBe(200); - expect(response2.status).toBe(200); - }); - - it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); - expect(response.status).toBe(200); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts deleted file mode 100644 index d7b6d1e63caa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; - -describe("Test getTimeoutSignal", () => { - beforeEach(() => { - vi.useFakeTimers(); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - it("should return an object with signal and abortId", () => { - const { signal, abortId } = getTimeoutSignal(1000); - - expect(signal).toBeDefined(); - expect(abortId).toBeDefined(); - expect(signal).toBeInstanceOf(AbortSignal); - expect(signal.aborted).toBe(false); - }); - - it("should create a signal that aborts after the specified timeout", () => { - const timeoutMs = 5000; - const { signal } = getTimeoutSignal(timeoutMs); - - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(timeoutMs - 1); - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(1); - expect(signal.aborted).toBe(true); - }); -}); - -describe("Test anySignal", () => { - it("should return an AbortSignal", () => { - const signal = anySignal(new AbortController().signal); - expect(signal).toBeInstanceOf(AbortSignal); - }); - - it("should abort when any of the input signals is aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal(controller1.signal, controller2.signal); - - expect(signal.aborted).toBe(false); - controller1.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should handle an array of signals", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal([controller1.signal, controller2.signal]); - - expect(signal.aborted).toBe(false); - controller2.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should abort immediately if one of the input signals is already aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - controller1.abort(); - - const signal = anySignal(controller1.signal, controller2.signal); - expect(signal.aborted).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt deleted file mode 100644 index c66d471e359c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts deleted file mode 100644 index 2e0b5fe5040c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts +++ /dev/null @@ -1,454 +0,0 @@ -import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -describe("Logger", () => { - describe("LogLevel", () => { - it("should have correct log levels", () => { - expect(LogLevel.Debug).toBe("debug"); - expect(LogLevel.Info).toBe("info"); - expect(LogLevel.Warn).toBe("warn"); - expect(LogLevel.Error).toBe("error"); - }); - }); - - describe("ConsoleLogger", () => { - let consoleLogger: ConsoleLogger; - let consoleSpy: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - consoleLogger = new ConsoleLogger(); - consoleSpy = { - debug: vi.spyOn(console, "debug").mockImplementation(() => {}), - info: vi.spyOn(console, "info").mockImplementation(() => {}), - warn: vi.spyOn(console, "warn").mockImplementation(() => {}), - error: vi.spyOn(console, "error").mockImplementation(() => {}), - }; - }); - - afterEach(() => { - consoleSpy.debug.mockRestore(); - consoleSpy.info.mockRestore(); - consoleSpy.warn.mockRestore(); - consoleSpy.error.mockRestore(); - }); - - it("should log debug messages", () => { - consoleLogger.debug("debug message", { data: "test" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); - }); - - it("should log info messages", () => { - consoleLogger.info("info message", { data: "test" }); - expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); - }); - - it("should log warn messages", () => { - consoleLogger.warn("warn message", { data: "test" }); - expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); - }); - - it("should log error messages", () => { - consoleLogger.error("error message", { data: "test" }); - expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); - }); - - it("should handle multiple arguments", () => { - consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); - }); - }); - - describe("Logger with level filtering", () => { - let mockLogger: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - mockLogger = createMockLogger(); - }); - - describe("Debug level", () => { - it("should log all levels when set to debug", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).toHaveBeenCalledWith("debug"); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(true); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Info level", () => { - it("should log info, warn, and error when set to info", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Warn level", () => { - it("should log warn and error when set to warn", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Error level", () => { - it("should only log error when set to error", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Silent mode", () => { - it("should not log anything when silent is true", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should report all level checks as false when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(false); - }); - }); - - describe("shouldLog", () => { - it("should correctly determine if level should be logged", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(true); - expect(logger.shouldLog(LogLevel.Warn)).toBe(true); - expect(logger.shouldLog(LogLevel.Error)).toBe(true); - }); - - it("should return false for all levels when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - expect(logger.shouldLog(LogLevel.Warn)).toBe(false); - expect(logger.shouldLog(LogLevel.Error)).toBe(false); - }); - }); - - describe("Multiple arguments", () => { - it("should pass multiple arguments to logger", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message", "arg1", { key: "value" }, 123); - expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); - }); - }); - }); - - describe("createLogger", () => { - it("should return default logger when no config provided", () => { - const logger = createLogger(); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should return same logger instance when Logger is passed", () => { - const customLogger = new Logger({ - level: LogLevel.Debug, - logger: new ConsoleLogger(), - silent: false, - }); - - const result = createLogger(customLogger); - expect(result).toBe(customLogger); - }); - - it("should create logger with custom config", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger).toBeInstanceOf(Logger); - logger.warn("test"); - expect(mockLogger.warn).toHaveBeenCalledWith("test"); - }); - - it("should use default values for missing config", () => { - const logger = createLogger({}); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should override default level", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("test"); - expect(mockLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should override default silent mode", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - silent: false, - }); - - logger.info("test"); - expect(mockLogger.info).toHaveBeenCalledWith("test"); - }); - - it("should use provided logger implementation", () => { - const customLogger = createMockLogger(); - - const logger = createLogger({ - logger: customLogger, - level: LogLevel.Debug, - silent: false, - }); - - logger.debug("test"); - expect(customLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should default to silent: true", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - level: LogLevel.Debug, - }); - - logger.debug("test"); - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Default logger", () => { - it("should have silent: true by default", () => { - const logger = createLogger(); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - }); - - it("should not log when using default logger", () => { - const logger = createLogger(); - - logger.info("test"); - expect(logger.isInfo()).toBe(false); - }); - }); - - describe("Edge cases", () => { - it("should handle empty message", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug(""); - expect(mockLogger.debug).toHaveBeenCalledWith(""); - }); - - it("should handle no arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message"); - expect(mockLogger.debug).toHaveBeenCalledWith("message"); - }); - - it("should handle complex objects", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - const complexObject = { - nested: { key: "value" }, - array: [1, 2, 3], - fn: () => "test", - }; - - logger.debug("message", complexObject); - expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); - }); - - it("should handle errors as arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - const error = new Error("Test error"); - logger.error("Error occurred", error); - expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts deleted file mode 100644 index 123488f084ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { join } from "../../../src/core/url/index"; - -describe("join", () => { - interface TestCase { - description: string; - base: string; - segments: string[]; - expected: string; - } - - describe("basic functionality", () => { - const basicTests: TestCase[] = [ - { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, - { - description: "should return empty string for empty base with path", - base: "", - segments: ["path"], - expected: "", - }, - { - description: "should handle single segment", - base: "base", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with trailing slash on base", - base: "base/", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with leading slash", - base: "base", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with both slashes", - base: "base/", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle multiple segments", - base: "base", - segments: ["path1", "path2", "path3"], - expected: "base/path1/path2/path3", - }, - { - description: "should handle multiple segments with slashes", - base: "base/", - segments: ["/path1/", "/path2/", "/path3/"], - expected: "base/path1/path2/path3/", - }, - ]; - - basicTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("URL handling", () => { - const urlTests: TestCase[] = [ - { - description: "should handle absolute URLs", - base: "https://example.com", - segments: ["api", "v1"], - expected: "https://example.com/api/v1", - }, - { - description: "should handle absolute URLs with slashes", - base: "https://example.com/", - segments: ["/api/", "/v1/"], - expected: "https://example.com/api/v1/", - }, - { - description: "should handle absolute URLs with base path", - base: "https://example.com/base", - segments: ["api", "v1"], - expected: "https://example.com/base/api/v1", - }, - { - description: "should preserve URL query parameters", - base: "https://example.com?query=1", - segments: ["api"], - expected: "https://example.com/api?query=1", - }, - { - description: "should preserve URL fragments", - base: "https://example.com#fragment", - segments: ["api"], - expected: "https://example.com/api#fragment", - }, - { - description: "should preserve URL query and fragments", - base: "https://example.com?query=1#fragment", - segments: ["api"], - expected: "https://example.com/api?query=1#fragment", - }, - { - description: "should handle http protocol", - base: "http://example.com", - segments: ["api"], - expected: "http://example.com/api", - }, - { - description: "should handle ftp protocol", - base: "ftp://example.com", - segments: ["files"], - expected: "ftp://example.com/files", - }, - { - description: "should handle ws protocol", - base: "ws://example.com", - segments: ["socket"], - expected: "ws://example.com/socket", - }, - { - description: "should fallback to path joining for malformed URLs", - base: "not-a-url://", - segments: ["path"], - expected: "not-a-url:///path", - }, - ]; - - urlTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("edge cases", () => { - const edgeCaseTests: TestCase[] = [ - { - description: "should handle empty segments", - base: "base", - segments: ["", "path"], - expected: "base/path", - }, - { - description: "should handle null segments", - base: "base", - segments: [null as any, "path"], - expected: "base/path", - }, - { - description: "should handle undefined segments", - base: "base", - segments: [undefined as any, "path"], - expected: "base/path", - }, - { - description: "should handle segments with only single slash", - base: "base", - segments: ["/", "path"], - expected: "base/path", - }, - { - description: "should handle segments with only double slash", - base: "base", - segments: ["//", "path"], - expected: "base/path", - }, - { - description: "should handle base paths with trailing slashes", - base: "base/", - segments: ["path"], - expected: "base/path", - }, - { - description: "should handle complex nested paths", - base: "api/v1/", - segments: ["/users/", "/123/", "/profile"], - expected: "api/v1/users/123/profile", - }, - ]; - - edgeCaseTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("real-world scenarios", () => { - const realWorldTests: TestCase[] = [ - { - description: "should handle API endpoint construction", - base: "https://api.example.com/v1", - segments: ["users", "123", "posts"], - expected: "https://api.example.com/v1/users/123/posts", - }, - { - description: "should handle file path construction", - base: "/var/www", - segments: ["html", "assets", "images"], - expected: "/var/www/html/assets/images", - }, - { - description: "should handle relative path construction", - base: "../parent", - segments: ["child", "grandchild"], - expected: "../parent/child/grandchild", - }, - { - description: "should handle Windows-style paths", - base: "C:\\Users", - segments: ["Documents", "file.txt"], - expected: "C:\\Users/Documents/file.txt", - }, - ]; - - realWorldTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("performance scenarios", () => { - it("should handle many segments efficiently", () => { - const segments = Array(100).fill("segment"); - const result = join("base", ...segments); - expect(result).toBe(`base/${segments.join("/")}`); - }); - - it("should handle long URLs", () => { - const longPath = "a".repeat(1000); - expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); - }); - }); - - describe("trailing slash preservation", () => { - const trailingSlashTests: TestCase[] = [ - { - description: - "should preserve trailing slash on final result when base has trailing slash and no segments", - base: "https://api.example.com/", - segments: [], - expected: "https://api.example.com/", - }, - { - description: "should preserve trailing slash on v1 path", - base: "https://api.example.com/v1/", - segments: [], - expected: "https://api.example.com/v1/", - }, - { - description: "should preserve trailing slash when last segment has trailing slash", - base: "https://api.example.com", - segments: ["users/"], - expected: "https://api.example.com/users/", - }, - { - description: "should preserve trailing slash with relative path", - base: "api/v1", - segments: ["users/"], - expected: "api/v1/users/", - }, - { - description: "should preserve trailing slash with multiple segments", - base: "https://api.example.com", - segments: ["v1", "collections/"], - expected: "https://api.example.com/v1/collections/", - }, - { - description: "should preserve trailing slash with base path", - base: "base", - segments: ["path1", "path2/"], - expected: "base/path1/path2/", - }, - ]; - - trailingSlashTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts deleted file mode 100644 index 42cdffb9e5ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { toQueryString } from "../../../src/core/url/index"; - -describe("Test qs toQueryString", () => { - interface BasicTestCase { - description: string; - input: any; - expected: string; - } - - describe("Basic functionality", () => { - const basicTests: BasicTestCase[] = [ - { description: "should return empty string for null", input: null, expected: "" }, - { description: "should return empty string for undefined", input: undefined, expected: "" }, - { description: "should return empty string for string primitive", input: "hello", expected: "" }, - { description: "should return empty string for number primitive", input: 42, expected: "" }, - { description: "should return empty string for true boolean", input: true, expected: "" }, - { description: "should return empty string for false boolean", input: false, expected: "" }, - { description: "should handle empty objects", input: {}, expected: "" }, - { - description: "should handle simple key-value pairs", - input: { name: "John", age: 30 }, - expected: "name=John&age=30", - }, - ]; - - basicTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Array handling", () => { - interface ArrayTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const arrayTests: ArrayTestCase[] = [ - { - description: "should handle arrays with indices format (default)", - input: { items: ["a", "b", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", - }, - { - description: "should handle arrays with repeat format", - input: { items: ["a", "b", "c"] }, - options: { arrayFormat: "repeat" }, - expected: "items=a&items=b&items=c", - }, - { - description: "should handle empty arrays", - input: { items: [] }, - expected: "", - }, - { - description: "should handle arrays with mixed types", - input: { mixed: ["string", 42, true, false] }, - expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", - }, - { - description: "should handle arrays with objects", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", - }, - { - description: "should handle arrays with objects in repeat format", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - options: { arrayFormat: "repeat" }, - expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", - }, - ]; - - arrayTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Nested objects", () => { - const nestedTests: BasicTestCase[] = [ - { - description: "should handle nested objects", - input: { user: { name: "John", age: 30 } }, - expected: "user%5Bname%5D=John&user%5Bage%5D=30", - }, - { - description: "should handle deeply nested objects", - input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, - expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle empty nested objects", - input: { user: {} }, - expected: "", - }, - ]; - - nestedTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Encoding", () => { - interface EncodingTestCase { - description: string; - input: any; - options?: { encode?: boolean }; - expected: string; - } - - const encodingTests: EncodingTestCase[] = [ - { - description: "should encode by default", - input: { name: "John Doe", email: "john@example.com" }, - expected: "name=John%20Doe&email=john%40example.com", - }, - { - description: "should not encode when encode is false", - input: { name: "John Doe", email: "john@example.com" }, - options: { encode: false }, - expected: "name=John Doe&email=john@example.com", - }, - { - description: "should encode special characters in keys", - input: { "user name": "John", "email[primary]": "john@example.com" }, - expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", - }, - { - description: "should not encode special characters in keys when encode is false", - input: { "user name": "John", "email[primary]": "john@example.com" }, - options: { encode: false }, - expected: "user name=John&email[primary]=john@example.com", - }, - ]; - - encodingTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Mixed scenarios", () => { - interface MixedTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const mixedTests: MixedTestCase[] = [ - { - description: "should handle complex nested structures", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle complex nested structures with repeat format", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - options: { arrayFormat: "repeat" }, - expected: - "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle arrays with null/undefined values", - input: { items: ["a", null, "c", undefined, "e"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", - }, - { - description: "should handle objects with null/undefined values", - input: { name: "John", age: null, email: undefined, active: true }, - expected: "name=John&age=&active=true", - }, - ]; - - mixedTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Edge cases", () => { - const edgeCaseTests: BasicTestCase[] = [ - { - description: "should handle numeric keys", - input: { "0": "zero", "1": "one" }, - expected: "0=zero&1=one", - }, - { - description: "should handle boolean values in objects", - input: { enabled: true, disabled: false }, - expected: "enabled=true&disabled=false", - }, - { - description: "should handle empty strings", - input: { name: "", description: "test" }, - expected: "name=&description=test", - }, - { - description: "should handle zero values", - input: { count: 0, price: 0.0 }, - expected: "count=0&price=0", - }, - { - description: "should handle arrays with empty strings", - input: { items: ["a", "", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", - }, - ]; - - edgeCaseTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Options combinations", () => { - interface OptionsTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; - expected: string; - } - - const optionsTests: OptionsTestCase[] = [ - { - description: "should respect both arrayFormat and encode options", - input: { items: ["a & b", "c & d"] }, - options: { arrayFormat: "repeat", encode: false }, - expected: "items=a & b&items=c & d", - }, - { - description: "should use default options when none provided", - input: { items: ["a", "b"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b", - }, - { - description: "should merge provided options with defaults", - input: { items: ["a", "b"], name: "John Doe" }, - options: { encode: false }, - expected: "items[0]=a&items[1]=b&name=John Doe", - }, - ]; - - optionsTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts deleted file mode 100644 index 98b9ec0c58b9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContainerClient", () => { - test("getAndReturnListOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string", "string"]; - const rawResponseBody = ["string", "string"]; - server - .mockEndpoint() - .post("/container/list-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - expect(response).toEqual(["string", "string"]); - }); - - test("getAndReturnListOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }, { string: "string" }]; - const rawResponseBody = [{ string: "string" }, { string: "string" }]; - server - .mockEndpoint() - .post("/container/list-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfObjects([ - { - string: "string", - }, - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - { - string: "string", - }, - ]); - }); - - test("getAndReturnSetOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string"]; - const rawResponseBody = ["string"]; - server - .mockEndpoint() - .post("/container/set-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - expect(response).toEqual(new Set(["string"])); - }); - - test("getAndReturnSetOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }]; - const rawResponseBody = [{ string: "string" }]; - server - .mockEndpoint() - .post("/container/set-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfObjects([ - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - ]); - }); - - test("getAndReturnMapPrimToPrim", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/map-prim-to-prim") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnMapOfPrimToObject", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: { string: "string" } }; - const rawResponseBody = { string: { string: "string" } }; - server - .mockEndpoint() - .post("/container/map-prim-to-object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ - string: { - string: "string", - }, - }); - expect(response).toEqual({ - string: { - string: "string", - }, - }); - }); - - test("getAndReturnOptional", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/opt-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnOptional({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts deleted file mode 100644 index 4bc8916f7ce5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContentTypeClient", () => { - test("postJsonPatchContentType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); - - test("postJsonPatchContentWithCharsetType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts deleted file mode 100644 index 5770be42a097..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("EnumClient", () => { - test("getAndReturnEnum", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SUNNY"; - const rawResponseBody = "SUNNY"; - server - .mockEndpoint() - .post("/enum") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); - expect(response).toEqual("SUNNY"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts deleted file mode 100644 index b9e26c032ff9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts +++ /dev/null @@ -1,212 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("HttpMethodsClient", () => { - test("testGet", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.httpMethods.testGet("id"); - expect(response).toEqual("string"); - }); - - test("testPost", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/http-methods") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPost({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPut", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .put("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPut("id", { - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPatch", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .patch("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testDelete", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = true; - server - .mockEndpoint() - .delete("/http-methods/id") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testDelete("id"); - expect(response).toEqual(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts deleted file mode 100644 index 685826602e5e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts +++ /dev/null @@ -1,448 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ObjectClient", () => { - test("getAndReturnWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/object/get-and-return-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("getAndReturnWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/object/get-and-return-with-required-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnWithMapOfMap", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { map: { map: { map: "map" } } }; - const rawResponseBody = { map: { map: { map: "map" } } }; - server - .mockEndpoint() - .post("/object/get-and-return-with-map-of-map") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - map: { - map: "map", - }, - }, - }); - expect(response).toEqual({ - map: { - map: { - map: "map", - }, - }, - }); - }); - - test("getAndReturnNestedWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredFieldAsList", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - ]; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field-list") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - ]); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts deleted file mode 100644 index be2e7ddd6591..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ParamsClient", () => { - test("getWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithPath("param"); - expect(response).toEqual("string"); - }); - - test("getWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithInlinePath({ - param: "param", - }); - expect(response).toEqual("string"); - }); - - test("getWithQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithAllowMultipleQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithPathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithPathAndQuery("param", { - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("getWithInlinePathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("modifyWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithPath("param", "string"); - expect(response).toEqual("string"); - }); - - test("modifyWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string", - }); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts deleted file mode 100644 index 650fc620bb1d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PrimitiveClient", () => { - test("getAndReturnString", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .post("/primitive/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnString("string"); - expect(response).toEqual("string"); - }); - - test("getAndReturnInt", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1; - const rawResponseBody = 1; - server - .mockEndpoint() - .post("/primitive/integer") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnInt(1); - expect(response).toEqual(1); - }); - - test("getAndReturnLong", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1000000; - const rawResponseBody = 1000000; - server - .mockEndpoint() - .post("/primitive/long") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnLong(1000000); - expect(response).toEqual(1000000); - }); - - test("getAndReturnDouble", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1.1; - const rawResponseBody = 1.1; - server - .mockEndpoint() - .post("/primitive/double") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDouble(1.1); - expect(response).toEqual(1.1); - }); - - test("getAndReturnBool", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = true; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/primitive/boolean") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBool(true); - expect(response).toEqual(true); - }); - - test("getAndReturnDatetime", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2024-01-15T09:30:00Z"; - const rawResponseBody = "2024-01-15T09:30:00Z"; - server - .mockEndpoint() - .post("/primitive/datetime") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); - }); - - test("getAndReturnDate", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2023-01-15"; - const rawResponseBody = "2023-01-15"; - server - .mockEndpoint() - .post("/primitive/date") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - expect(response).toEqual("2023-01-15"); - }); - - test("getAndReturnUUID", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - server - .mockEndpoint() - .post("/primitive/uuid") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - }); - - test("getAndReturnBase64", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SGVsbG8gd29ybGQh"; - const rawResponseBody = "SGVsbG8gd29ybGQh"; - server - .mockEndpoint() - .post("/primitive/base64") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - expect(response).toEqual("SGVsbG8gd29ybGQh"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts deleted file mode 100644 index 1481521d77b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PutClient", () => { - test("add", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - errors: [ - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - ], - }; - server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.put.add({ - id: "id", - }); - expect(response).toEqual({ - errors: [ - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - ], - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts deleted file mode 100644 index 35b1405e89ca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UnionClient", () => { - test("getAndReturnUnion", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; - const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; - server - .mockEndpoint() - .post("/union") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - expect(response).toEqual({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts deleted file mode 100644 index b450fbeea217..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UrlsClient", () => { - test("withMixedCase", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.urls.withMixedCase(); - expect(response).toEqual("string"); - }); - - test("noEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/no-ending-slash") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.noEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with-ending-slash/") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withUnderscores", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with_underscores") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withUnderscores(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts deleted file mode 100644 index 61b5a64bce8f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts +++ /dev/null @@ -1,150 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("InlinedRequestsClient", () => { - test("postWithObjectBodyandResponse (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithObjectBodyandResponse (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts deleted file mode 100644 index 3317cf1a69d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoAuthClient", () => { - test("postWithNoAuth (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.noAuth.postWithNoAuth({ - key: "value", - }); - expect(response).toEqual(true); - }); - - test("postWithNoAuth (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.noAuth.postWithNoAuth({ - key: "value", - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts deleted file mode 100644 index 8f5f6a59a512..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoReqBodyClient", () => { - test("getWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.getWithNoRequestBody(); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.postWithNoRequestBody(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts deleted file mode 100644 index a128d4844ba2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("ReqWithHeadersClient", () => { - test("getWithCustomHeader", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - - server - .mockEndpoint() - .post("/test-headers/custom-header") - .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") - .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .build(); - - const response = await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json deleted file mode 100644 index d7627675de20..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "extendedDiagnostics": true, - "strict": true, - "target": "ES6", - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "dist", - "rootDir": "src", - "baseUrl": "src", - "isolatedModules": true, - "isolatedDeclarations": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json deleted file mode 100644 index 5c11446f5984..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "dist/cjs" - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json deleted file mode 100644 index 6ce909748b2c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "esnext", - "outDir": "dist/esm", - "verbatimModuleSyntax": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json deleted file mode 100644 index d77fdf00d259..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.cjs.json" -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts deleted file mode 100644 index ba2ec4f9d45a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from "vitest/config"; -export default defineConfig({ - test: { - projects: [ - { - test: { - globals: true, - name: "unit", - environment: "node", - root: "./tests", - include: ["**/*.test.{js,ts,jsx,tsx}"], - exclude: ["wire/**"], - setupFiles: ["./setup.ts"], - }, - }, - { - test: { - globals: true, - name: "wire", - environment: "node", - root: "./tests/wire", - setupFiles: ["../setup.ts", "../mock-server/setup.ts"], - }, - }, - ], - passWithNoTests: true, - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json deleted file mode 100644 index bc0673c609b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "cliVersion": "DUMMY", - "generatorName": "fernapi/fern-typescript-sdk", - "generatorVersion": "latest", - "generatorConfig": { - "serializationFormat": "zurg" - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml deleted file mode 100644 index 836106996595..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: ci - -on: [push] - -jobs: - compile: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Compile - run: pnpm build - - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Test - run: pnpm test - - publish: - needs: [ compile, test ] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build - run: pnpm build - - - name: Publish to npm - run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - publish() { # use latest npm to ensure OIDC support - npx -y npm@latest publish "$@" - } - if [[ ${GITHUB_REF} == *alpha* ]]; then - publish --access public --tag alpha - elif [[ ${GITHUB_REF} == *beta* ]]; then - publish --access public --tag beta - else - publish --access public - fi - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore deleted file mode 100644 index 72271e049c02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.DS_Store -/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md deleted file mode 100644 index fe5bc2f77e0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md +++ /dev/null @@ -1,133 +0,0 @@ -# Contributing - -Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. - -## Getting Started - -### Prerequisites - -- Node.js 20 or higher -- pnpm package manager - -### Installation - -Install the project dependencies: - -```bash -pnpm install -``` - -### Building - -Build the project: - -```bash -pnpm build -``` - -### Testing - -Run the test suite: - -```bash -pnpm test -``` - -Run specific test types: -- `pnpm test:unit` - Run unit tests -- `pnpm test:wire` - Run wire/integration tests - -### Linting and Formatting - -Check code style: - -```bash -pnpm run lint -pnpm run format:check -``` - -Fix code style issues: - -```bash -pnpm run lint:fix -pnpm run format:fix -``` - -Or use the combined check command: - -```bash -pnpm run check:fix -``` - -## About Generated Code - -**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. - -### Generated Files - -The following directories contain generated code: -- `src/api/` - API client classes and types -- `src/serialization/` - Serialization/deserialization logic -- Most TypeScript files in `src/` - -### How to Customize - -If you need to customize the SDK, you have two options: - -#### Option 1: Use `.fernignore` - -For custom code that should persist across SDK regenerations: - -1. Create a `.fernignore` file in the project root -2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) -3. Add your custom code to those files - -Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. - -For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). - -#### Option 2: Contribute to the Generator - -If you want to change how code is generated for all users of this SDK: - -1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) -2. Generator code is located at `generators/typescript/sdk/` -3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) -4. Submit a pull request with your changes to the generator - -This approach is best for: -- Bug fixes in generated code -- New features that would benefit all users -- Improvements to code generation patterns - -## Making Changes - -### Workflow - -1. Create a new branch for your changes -2. Make your modifications -3. Run tests to ensure nothing breaks: `pnpm test` -4. Run linting and formatting: `pnpm run check:fix` -5. Build the project: `pnpm build` -6. Commit your changes with a clear commit message -7. Push your branch and create a pull request - -### Commit Messages - -Write clear, descriptive commit messages that explain what changed and why. - -### Code Style - -This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. - -## Questions or Issues? - -If you have questions or run into issues: - -1. Check the [Fern documentation](https://buildwithfern.com) -2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) -3. Open a new issue if your question hasn't been addressed - -## License - -By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md deleted file mode 100644 index 140b1fb505f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md +++ /dev/null @@ -1,241 +0,0 @@ -# Seed TypeScript Library - -[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) -[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) - -The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. - -## Installation - -```sh -npm i -s @fern/exhaustive -``` - -## Reference - -A full reference for this library is available [here](./reference.md). - -## Usage - -Instantiate and use the client with the following: - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); -``` - -## Request And Response Types - -The SDK exports all request and response types as TypeScript interfaces. Simply import them with the -following namespace: - -```typescript -import { SeedExhaustive } from "@fern/exhaustive"; - -const request: SeedExhaustive.GetWithInlinePath = { - ... -}; -``` - -## Exception Handling - -When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error -will be thrown. - -```typescript -import { SeedExhaustiveError } from "@fern/exhaustive"; - -try { - await client.endpoints.container.getAndReturnListOfPrimitives(...); -} catch (err) { - if (err instanceof SeedExhaustiveError) { - console.log(err.statusCode); - console.log(err.message); - console.log(err.body); - console.log(err.rawResponse); - } -} -``` - -## Advanced - -### Additional Headers - -If you would like to send additional headers as part of the request, use the `headers` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - headers: { - 'X-Custom-Header': 'custom value' - } -}); -``` - -### Additional Query String Parameters - -If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - queryParams: { - 'customQueryParamKey': 'custom query param value' - } -}); -``` - -### Retries - -The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long -as the request is deemed retryable and the number of retry attempts has not grown larger than the configured -retry limit (default: 2). - -A request is deemed retryable when any of the following HTTP status codes is returned: - -- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) -- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) -- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) - -Use the `maxRetries` request option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - maxRetries: 0 // override maxRetries at the request level -}); -``` - -### Timeouts - -The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - timeoutInSeconds: 30 // override timeout to 30s -}); -``` - -### Aborting Requests - -The SDK allows users to abort requests at any point by passing in an abort signal. - -```typescript -const controller = new AbortController(); -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - abortSignal: controller.signal -}); -controller.abort(); // aborts the request -``` - -### Access Raw Response Data - -The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. -The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. - -```typescript -const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); - -console.log(data); -console.log(rawResponse.headers['X-My-Header']); -``` - -### Logging - -The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. - -```typescript -import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - logging: { - level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info - logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger - silent: false, // defaults to true, set to false to enable logging - } -}); -``` -The `logging` object can have the following properties: -- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. -- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. -- `silent`: Whether to silence the logger. Defaults to `true`. - -The `level` property can be one of the following values: -- `logging.LogLevel.Debug` -- `logging.LogLevel.Info` -- `logging.LogLevel.Warn` -- `logging.LogLevel.Error` - -To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. - -
-Custom logger examples - -Here's an example using the popular `winston` logging library. -```ts -import winston from 'winston'; - -const winstonLogger = winston.createLogger({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => winstonLogger.debug(msg, ...args), - info: (msg, ...args) => winstonLogger.info(msg, ...args), - warn: (msg, ...args) => winstonLogger.warn(msg, ...args), - error: (msg, ...args) => winstonLogger.error(msg, ...args), -}; -``` - -Here's an example using the popular `pino` logging library. - -```ts -import pino from 'pino'; - -const pinoLogger = pino({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => pinoLogger.debug(args, msg), - info: (msg, ...args) => pinoLogger.info(args, msg), - warn: (msg, ...args) => pinoLogger.warn(args, msg), - error: (msg, ...args) => pinoLogger.error(args, msg), -}; -``` -
- - -### Runtime Compatibility - - -The SDK works in the following runtimes: - - - -- Node.js 18+ -- Vercel -- Cloudflare Workers -- Deno v1.25+ -- Bun 1.0+ -- React Native - -### Customizing Fetch Client - -The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an -unsupported environment, this provides a way for you to break glass and ensure the SDK works. - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - fetcher: // provide your implementation here -}); -``` - -## Contributing - -While we value open-source contributions to this SDK, this library is generated programmatically. -Additions made directly to this library would have to be moved over to our generation code, -otherwise they would be overwritten upon the next generated release. Feel free to open a PR as -a proof of concept, but know that we will not be able to merge it as-is. We suggest opening -an issue first to discuss with us! - -On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json deleted file mode 100644 index a777468e4ae2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", - "root": true, - "vcs": { - "enabled": false - }, - "files": { - "ignoreUnknown": true, - "includes": [ - "**", - "!!dist", - "!!**/dist", - "!!lib", - "!!**/lib", - "!!_tmp_*", - "!!**/_tmp_*", - "!!*.tmp", - "!!**/*.tmp", - "!!.tmp/", - "!!**/.tmp/", - "!!*.log", - "!!**/*.log", - "!!**/.DS_Store", - "!!**/Thumbs.db" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 4, - "lineWidth": 120 - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - }, - "linter": { - "rules": { - "style": { - "useNodejsImportProtocol": "off" - }, - "suspicious": { - "noAssignInExpressions": "warn", - "noUselessEscapeInString": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noThenProperty": "warn", - "useIterableCallbackReturn": "warn", - "noShadowRestrictedNames": "warn", - "noTsIgnore": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noConfusingVoidType": { - "level": "warn", - "fix": "none", - "options": {} - } - } - } - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json deleted file mode 100644 index ac3de0f37468..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "@fern/exhaustive", - "version": "0.0.1", - "private": false, - "repository": "github:exhaustive/fern", - "type": "commonjs", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.mjs", - "types": "./dist/cjs/index.d.ts", - "exports": { - ".": { - "types": "./dist/cjs/index.d.ts", - "import": { - "types": "./dist/esm/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - }, - "default": "./dist/cjs/index.js" - }, - "./serialization": { - "types": "./dist/cjs/serialization/index.d.ts", - "import": { - "types": "./dist/esm/serialization/index.d.mts", - "default": "./dist/esm/serialization/index.mjs" - }, - "require": { - "types": "./dist/cjs/serialization/index.d.ts", - "default": "./dist/cjs/serialization/index.js" - }, - "default": "./dist/cjs/serialization/index.js" - }, - "./package.json": "./package.json" - }, - "files": [ - "dist", - "reference.md", - "README.md", - "LICENSE" - ], - "scripts": { - "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "build": "pnpm build:cjs && pnpm build:esm", - "build:cjs": "tsc --project ./tsconfig.cjs.json", - "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", - "test": "vitest", - "test:unit": "vitest --project unit", - "test:wire": "vitest --project wire" - }, - "dependencies": {}, - "devDependencies": { - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", - "vitest": "^3.2.4", - "msw": "2.11.2", - "@types/node": "^18.19.70", - "typescript": "~5.7.2", - "@biomejs/biome": "2.3.1" - }, - "browser": { - "fs": false, - "os": false, - "path": false, - "stream": false - }, - "packageManager": "pnpm@10.20.0", - "engines": { - "node": ">=18.0.0" - }, - "sideEffects": false -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml deleted file mode 100644 index 6e4c395107df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml +++ /dev/null @@ -1 +0,0 @@ -packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md deleted file mode 100644 index b571afcab9fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md +++ /dev/null @@ -1,2761 +0,0 @@ -# Reference -## Endpoints Container -
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfObjects([{ - string: "string" - }, { - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Set` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfObjects([{ - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapPrimToPrim({ - "string": "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapOfPrimToObject({ - "string": { - string: "string" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnOptional({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints ContentType -
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Enum -
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.enum.getAndReturnEnum("SUNNY"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.WeatherReport` - -
-
- -
-
- -**requestOptions:** `EnumClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints HttpMethods -
client.endpoints.httpMethods.testGet(id) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testGet("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPost({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPut("id", { - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testDelete(id) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testDelete("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Object -
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - "map": { - "map": "map" - } - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithMapOfMap` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**string:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }, { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Params -
client.endpoints.params.getWithPath(param) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPath("param"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePath({ - param: "param" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with multiple of same query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPathAndQuery("param", { - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithPath(param, { ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithPath("param", "string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Primitive -
client.endpoints.primitive.getAndReturnString({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnString("string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnInt(1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnLong(1000000); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDouble(1.1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBool(true); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `boolean` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Date` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Put -
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.put.add({ - id: "id" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.PutRequest` - -
-
- -
-
- -**requestOptions:** `PutClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Union -
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.Animal` - -
-
- -
-
- -**requestOptions:** `UnionClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Urls -
client.endpoints.urls.withMixedCase() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withMixedCase(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.noEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.noEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withUnderscores() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withUnderscores(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## InlinedRequests -
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 📝 Description - -
-
- -
-
- -POST with custom object in request body, response is an object -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.PostWithObjectBody` - -
-
- -
-
- -**requestOptions:** `InlinedRequestsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoAuth -
client.noAuth.postWithNoAuth({ ...params }) -> boolean -
-
- -#### 📝 Description - -
-
- -
-
- -POST request with no auth -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noAuth.postWithNoAuth({ - "key": "value" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `unknown` - -
-
- -
-
- -**requestOptions:** `NoAuthClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoReqBody -
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.getWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.noReqBody.postWithNoRequestBody() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.postWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## ReqWithHeaders -
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ReqWithHeaders` - -
-
- -
-
- -**requestOptions:** `ReqWithHeadersClient.RequestOptions` - -
-
-
-
- - -
-
-
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js deleted file mode 100644 index dc1df1cbbacb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs").promises; -const path = require("path"); - -const extensionMap = { - ".js": ".mjs", - ".d.ts": ".d.mts", -}; -const oldExtensions = Object.keys(extensionMap); - -async function findFiles(rootPath) { - const files = []; - - async function scan(directory) { - const entries = await fs.readdir(directory, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(directory, entry.name); - - if (entry.isDirectory()) { - if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { - await scan(fullPath); - } - } else if (entry.isFile()) { - if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { - files.push(fullPath); - } - } - } - } - - await scan(rootPath); - return files; -} - -async function updateFiles(files) { - const updatedFiles = []; - for (const file of files) { - const updated = await updateFileContents(file); - updatedFiles.push(updated); - } - - console.log(`Updated imports in ${updatedFiles.length} files.`); -} - -async function updateFileContents(file) { - const content = await fs.readFile(file, "utf8"); - - let newContent = content; - // Update each extension type defined in the map - for (const [oldExt, newExt] of Object.entries(extensionMap)) { - // Handle static imports/exports - const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); - newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); - - // Handle dynamic imports (yield import, await import, regular import()) - const dynamicRegex = new RegExp( - `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, - "g", - ); - newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); - } - - if (content !== newContent) { - await fs.writeFile(file, newContent, "utf8"); - return true; - } - return false; -} - -async function renameFiles(files) { - let counter = 0; - for (const file of files) { - const ext = oldExtensions.find((ext) => file.endsWith(ext)); - const newExt = extensionMap[ext]; - - if (newExt) { - const newPath = file.slice(0, -ext.length) + newExt; - await fs.rename(file, newPath); - counter++; - } - } - - console.log(`Renamed ${counter} files.`); -} - -async function main() { - try { - const targetDir = process.argv[2]; - if (!targetDir) { - console.error("Please provide a target directory"); - process.exit(1); - } - - const targetPath = path.resolve(targetDir); - const targetStats = await fs.stat(targetPath); - - if (!targetStats.isDirectory()) { - console.error("The provided path is not a directory"); - process.exit(1); - } - - console.log(`Scanning directory: ${targetDir}`); - - const files = await findFiles(targetDir); - - if (files.length === 0) { - console.log("No matching files found."); - process.exit(0); - } - - console.log(`Found ${files.length} files.`); - await updateFiles(files); - await renameFiles(files); - console.log("\nDone!"); - } catch (error) { - console.error("An error occurred:", error.message); - process.exit(1); - } -} - -main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json deleted file mode 100644 index 875b76c4bb57..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "endpoints": [ - { - "id": { - "path": "/container/list-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" - } - }, - { - "id": { - "path": "/container/list-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/set-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" - } - }, - { - "id": { - "path": "/container/set-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-prim", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-object", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" - } - }, - { - "id": { - "path": "/container/opt-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/foo/bar", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/foo/baz", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/enum", - "method": "POST", - "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "GET", - "identifier_override": "endpoint_endpoints/http-methods.testGet" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" - } - }, - { - "id": { - "path": "/http-methods", - "method": "POST", - "identifier_override": "endpoint_endpoints/http-methods.testPost" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/http-methods.testPut" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PATCH", - "identifier_override": "endpoint_endpoints/http-methods.testPatch" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "DELETE", - "identifier_override": "endpoint_endpoints/http-methods.testDelete" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-required-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-map-of-map", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field/{string}", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field-list", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/primitive/string", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" - } - }, - { - "id": { - "path": "/primitive/integer", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" - } - }, - { - "id": { - "path": "/primitive/long", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" - } - }, - { - "id": { - "path": "/primitive/double", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" - } - }, - { - "id": { - "path": "/primitive/boolean", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" - } - }, - { - "id": { - "path": "/primitive/datetime", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" - } - }, - { - "id": { - "path": "/primitive/date", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" - } - }, - { - "id": { - "path": "/primitive/uuid", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" - } - }, - { - "id": { - "path": "/primitive/base64", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" - } - }, - { - "id": { - "path": "/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/put.add" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" - } - }, - { - "id": { - "path": "/union", - "method": "POST", - "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" - } - }, - { - "id": { - "path": "/urls/MixedCase", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withMixedCase" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" - } - }, - { - "id": { - "path": "/urls/no-ending-slash", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.noEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with-ending-slash/", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with_underscores", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withUnderscores" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" - } - }, - { - "id": { - "path": "/req-bodies/object", - "method": "POST", - "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/no-auth", - "method": "POST", - "identifier_override": "endpoint_no-auth.postWithNoAuth" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "GET", - "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "POST", - "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/test-headers/custom-header", - "method": "POST", - "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" - } - } - ], - "types": {} -} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts deleted file mode 100644 index f28de2b4c43c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts +++ /dev/null @@ -1,82 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; -import { mergeHeaders } from "./core/headers.js"; -import * as core from "./core/index.js"; - -export interface BaseClientOptions { - environment: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token?: core.Supplier; - /** Additional headers to include in requests. */ - headers?: Record | null | undefined>; - /** The default maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The default number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ - fetch?: typeof fetch; - /** Configure logging for the client. */ - logging?: core.logging.LogConfig | core.logging.Logger; -} - -export interface BaseRequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Additional query string parameters to include in the request. */ - queryParams?: Record; - /** Additional headers to include in the request. */ - headers?: Record | null | undefined>; -} - -export type NormalizedClientOptions = T & { - logging: core.logging.Logger; - authProvider?: core.AuthProvider; -}; - -export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { - authProvider: core.AuthProvider; -}; - -export function normalizeClientOptions(options: T): NormalizedClientOptions { - const headers = mergeHeaders( - { - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "@fern/exhaustive", - "X-Fern-SDK-Version": "0.0.1", - "User-Agent": "@fern/exhaustive/0.0.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - }, - options?.headers, - ); - - return { - ...options, - logging: core.logging.createLogger(options?.logging), - headers, - } as NormalizedClientOptions; -} - -export function normalizeClientOptionsWithAuth( - options: T, -): NormalizedClientOptionsWithAuth { - const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; - const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); - normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); - return normalized; -} - -function withNoOpAuthProvider( - options: NormalizedClientOptions, -): NormalizedClientOptionsWithAuth { - return { - ...options, - authProvider: new core.NoOpAuthProvider(), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts deleted file mode 100644 index d5ca904d9544..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; -import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; -import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; -import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; -import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; -import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; - -export declare namespace SeedExhaustiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class SeedExhaustiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _endpoints: EndpointsClient | undefined; - protected _inlinedRequests: InlinedRequestsClient | undefined; - protected _noAuth: NoAuthClient | undefined; - protected _noReqBody: NoReqBodyClient | undefined; - protected _reqWithHeaders: ReqWithHeadersClient | undefined; - - constructor(options: SeedExhaustiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get endpoints(): EndpointsClient { - return (this._endpoints ??= new EndpointsClient(this._options)); - } - - public get inlinedRequests(): InlinedRequestsClient { - return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); - } - - public get noAuth(): NoAuthClient { - return (this._noAuth ??= new NoAuthClient(this._options)); - } - - public get noReqBody(): NoReqBodyClient { - return (this._noReqBody ??= new NoReqBodyClient(this._options)); - } - - public get reqWithHeaders(): ReqWithHeadersClient { - return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts deleted file mode 100644 index b124def3d861..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts +++ /dev/null @@ -1,76 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { ContainerClient } from "../resources/container/client/Client.js"; -import { ContentTypeClient } from "../resources/contentType/client/Client.js"; -import { EnumClient } from "../resources/enum/client/Client.js"; -import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; -import { ObjectClient } from "../resources/object/client/Client.js"; -import { ParamsClient } from "../resources/params/client/Client.js"; -import { PrimitiveClient } from "../resources/primitive/client/Client.js"; -import { PutClient } from "../resources/put/client/Client.js"; -import { UnionClient } from "../resources/union/client/Client.js"; -import { UrlsClient } from "../resources/urls/client/Client.js"; - -export declare namespace EndpointsClient { - export interface Options extends BaseClientOptions {} -} - -export class EndpointsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _container: ContainerClient | undefined; - protected _contentType: ContentTypeClient | undefined; - protected _enum: EnumClient | undefined; - protected _httpMethods: HttpMethodsClient | undefined; - protected _object: ObjectClient | undefined; - protected _params: ParamsClient | undefined; - protected _primitive: PrimitiveClient | undefined; - protected _put: PutClient | undefined; - protected _union: UnionClient | undefined; - protected _urls: UrlsClient | undefined; - - constructor(options: EndpointsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get container(): ContainerClient { - return (this._container ??= new ContainerClient(this._options)); - } - - public get contentType(): ContentTypeClient { - return (this._contentType ??= new ContentTypeClient(this._options)); - } - - public get enum(): EnumClient { - return (this._enum ??= new EnumClient(this._options)); - } - - public get httpMethods(): HttpMethodsClient { - return (this._httpMethods ??= new HttpMethodsClient(this._options)); - } - - public get object(): ObjectClient { - return (this._object ??= new ObjectClient(this._options)); - } - - public get params(): ParamsClient { - return (this._params ??= new ParamsClient(this._options)); - } - - public get primitive(): PrimitiveClient { - return (this._primitive ??= new PrimitiveClient(this._options)); - } - - public get put(): PutClient { - return (this._put ??= new PutClient(this._options)); - } - - public get union(): UnionClient { - return (this._union ??= new UnionClient(this._options)); - } - - public get urls(): UrlsClient { - return (this._urls ??= new UrlsClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts deleted file mode 100644 index 9eb1192dcc32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts deleted file mode 100644 index 32bb0a7fc21e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts +++ /dev/null @@ -1,543 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContainerClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContainerClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContainerClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) - */ - public getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response.parseOrThrow( - _response.body, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/list-of-primitives", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfObjects([{ - * string: "string" - * }, { - * string: "string" - * }]) - */ - public getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); - } - - private async __getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfObjects.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfObjects.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); - } - - /** - * @param {Set} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) - */ - public getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.parseOrThrow( - _response.body, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfObjects([{ - * string: "string" - * }]) - */ - public getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); - } - - private async __getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfObjects.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapPrimToPrim({ - * "string": "string" - * }) - */ - public getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); - } - - private async __getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-prim", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapOfPrimToObject({ - * "string": { - * string: "string" - * } - * }) - */ - public getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); - } - - private async __getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.parseOrThrow( - _response.body, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/map-prim-to-object", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnOptional({ - * string: "string" - * }) - */ - public getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); - } - - private async __getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/opt-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: - request != null - ? serializers.endpoints.container.getAndReturnOptional.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }) - : undefined, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnOptional.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts deleted file mode 100644 index 75f492ac343f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts +++ /dev/null @@ -1,178 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContentTypeClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContentTypeClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContentTypeClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); - } - - private async __postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/bar", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__postJsonPatchContentWithCharsetType(request, requestOptions), - ); - } - - private async __postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/baz", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json; charset=utf-8", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts deleted file mode 100644 index 9c9b0cd87c76..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace EnumClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class EnumClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: EnumClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.WeatherReport} request - * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.enum.getAndReturnEnum("SUNNY") - */ - public getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); - } - - private async __getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/enum", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.WeatherReport.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.WeatherReport.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts deleted file mode 100644 index 0298be639cde..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts +++ /dev/null @@ -1,380 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace HttpMethodsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class HttpMethodsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: HttpMethodsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testGet("id") - */ - public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); - } - - private async __testGet( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testGet.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPost({ - * string: "string" - * }) - */ - public testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); - } - - private async __testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/http-methods", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPut("id", { - * string: "string" - * }) - */ - public testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); - } - - private async __testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPatch("id", { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); - } - - private async __testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PATCH", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testDelete("id") - */ - public testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); - } - - private async __testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "DELETE", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testDelete.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts deleted file mode 100644 index 6046843b5e42..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * as container from "./container/index.js"; -export * as contentType from "./contentType/index.js"; -export * as enum_ from "./enum/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * from "./params/client/requests/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * from "./put/client/requests/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as union from "./union/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts deleted file mode 100644 index f7bbef9f5c00..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts +++ /dev/null @@ -1,577 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ObjectClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ObjectClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ObjectClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithOptionalField({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); - } - - private async __getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-optional-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithRequiredField({ - * string: "string" - * }) - */ - public getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); - } - - private async __getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-required-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithRequiredField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-required-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithMapOfMap} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithMapOfMap({ - * map: { - * "map": { - * "map": "map" - * } - * } - * }) - */ - public getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); - } - - private async __getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-map-of-map", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithMapOfMap.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithMapOfMap.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-map-of-map", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithOptionalField({ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithOptionalField(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-optional-field", - ); - } - - /** - * @param {string} string - * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field/{string}", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }, { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }]) - */ - public getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-required-field-list", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field-list", - ); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts deleted file mode 100644 index e26b85a0f305..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts +++ /dev/null @@ -1,565 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ParamsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ParamsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ParamsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * GET with path param - * - * @param {string} param - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPath("param") - */ - public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); - } - - private async __getWithPath( - param: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithPath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with path param - * - * @param {SeedExhaustive.endpoints.GetWithInlinePath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePath({ - * param: "param" - * }) - */ - public getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); - } - - private async __getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithInlinePath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with query param - * - * @param {SeedExhaustive.endpoints.GetWithQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); - } - - private async __getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - _queryParams.number = number_.toString(); - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with multiple of same query param - * - * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithAllowMultipleQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); - } - - private async __getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - if (Array.isArray(query)) { - _queryParams.query = query.map((item) => item); - } else { - _queryParams.query = query; - } - - if (Array.isArray(number_)) { - _queryParams.number = number_.map((item) => item.toString()); - } else { - _queryParams.number = number_.toString(); - } - - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with path and query params - * - * @param {string} param - * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPathAndQuery("param", { - * query: "query" - * }) - */ - public getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); - } - - private async __getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * GET with path and query params - * - * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePathAndQuery({ - * param: "param", - * query: "query" - * }) - */ - public getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); - } - - private async __getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * PUT to update with path param - * - * @param {string} param - * @param {string} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithPath("param", "string") - */ - public modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); - } - - private async __modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithPath.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithPath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } - - /** - * PUT to update with path param - * - * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithInlinePath({ - * param: "param", - * body: "string" - * }) - */ - public modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); - } - - private async __modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithInlinePath.Request.jsonOrThrow(_body, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithInlinePath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts deleted file mode 100644 index 473165eb1638..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param" - * } - */ -export interface GetWithInlinePath { - param: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts deleted file mode 100644 index 9c674a852dce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * query: "query" - * } - */ -export interface GetWithInlinePathAndQuery { - param: string; - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts deleted file mode 100644 index baca4fafbe62..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithMultipleQuery { - query: string | string[]; - number: number | number[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts deleted file mode 100644 index c3f0018a7874..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query" - * } - */ -export interface GetWithPathAndQuery { - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts deleted file mode 100644 index 7ad48dee4508..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithQuery { - query: string; - number: number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts deleted file mode 100644 index f3f91a06e3f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * body: "string" - * } - */ -export interface ModifyResourceAtInlinedPath { - param: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts deleted file mode 100644 index b059d3702a32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { GetWithInlinePath } from "./GetWithInlinePath.js"; -export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; -export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; -export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; -export type { GetWithQuery } from "./GetWithQuery.js"; -export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts deleted file mode 100644 index 22ff4d032983..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts +++ /dev/null @@ -1,644 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace PrimitiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PrimitiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PrimitiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnString("string") - */ - public getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); - } - - private async __getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/string", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnString.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnString.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnInt(1) - */ - public getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); - } - - private async __getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/integer", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnInt.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnInt.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnLong(1000000) - */ - public getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); - } - - private async __getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/long", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnLong.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnLong.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDouble(1.1) - */ - public getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); - } - - private async __getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/double", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDouble.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDouble.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); - } - - /** - * @param {boolean} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBool(true) - */ - public getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); - } - - private async __getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/boolean", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBool.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBool.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); - } - - /** - * @param {Date} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) - */ - public getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); - } - - private async __getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/datetime", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDatetime.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDatetime.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDate("2023-01-15") - */ - public getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); - } - - private async __getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/date", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDate.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDate.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") - */ - public getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); - } - - private async __getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/uuid", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnUuid.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnUuid.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") - */ - public getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); - } - - private async __getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/base64", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBase64.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBase64.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts deleted file mode 100644 index d3c0b566a0e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts +++ /dev/null @@ -1,90 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace PutClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PutClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PutClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.endpoints.PutRequest} request - * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.put.add({ - * id: "id" - * }) - */ - public add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); - } - - private async __add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): Promise> { - const { id } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.PutResponse.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts deleted file mode 100644 index 2beba9f087cc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * id: "id" - * } - */ -export interface PutRequest { - id: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts deleted file mode 100644 index dba0eda4bbee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts deleted file mode 100644 index d9adb1af9a93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index a197fec87887..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCategory = { - ApiError: "API_ERROR", - AuthenticationError: "AUTHENTICATION_ERROR", - InvalidRequestError: "INVALID_REQUEST_ERROR", -} as const; -export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 3943226222d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCode = { - InternalServerError: "INTERNAL_SERVER_ERROR", - Unauthorized: "UNAUTHORIZED", - Forbidden: "FORBIDDEN", - BadRequest: "BAD_REQUEST", - Conflict: "CONFLICT", - Gone: "GONE", - UnprocessableEntity: "UNPROCESSABLE_ENTITY", - NotImplemented: "NOT_IMPLEMENTED", - BadGateway: "BAD_GATEWAY", - ServiceUnavailable: "SERVICE_UNAVAILABLE", - Unknown: "Unknown", -} as const; -export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 9cf9f495a09a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface Error_ { - category: SeedExhaustive.endpoints.ErrorCategory; - code: SeedExhaustive.endpoints.ErrorCode; - detail?: string; - field?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 628b46ba7298..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface PutResponse { - errors?: SeedExhaustive.endpoints.Error_[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts deleted file mode 100644 index 8ebfb6371c4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts +++ /dev/null @@ -1,97 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace UnionClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UnionClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UnionClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.Animal} request - * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.union.getAndReturnUnion({ - * animal: "dog", - * name: "name", - * likesToWoof: true - * }) - */ - public getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); - } - - private async __getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/union", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.Animal.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.Animal.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts deleted file mode 100644 index 6eee97a8bd78..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts +++ /dev/null @@ -1,247 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace UrlsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UrlsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UrlsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withMixedCase() - */ - public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); - } - - private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/MixedCase", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withMixedCase.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.noEndingSlash() - */ - public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); - } - - private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/no-ending-slash", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.noEndingSlash.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withEndingSlash() - */ - public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); - } - - private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with-ending-slash/", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withEndingSlash.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withUnderscores() - */ - public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); - } - - private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with_underscores", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withUnderscores.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts deleted file mode 100644 index 6c0020d2b75a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../core/index.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export class BadRequestBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { - super({ - message: "BadRequestBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts deleted file mode 100644 index 61778bda5417..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index 6ad426742488..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface BadObjectRequestInfo { - message: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts deleted file mode 100644 index 3ca611c9fb54..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * from "./generalErrors/errors/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * from "./reqWithHeaders/client/requests/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts deleted file mode 100644 index 08c808a10650..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts +++ /dev/null @@ -1,126 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace InlinedRequestsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class InlinedRequestsClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: InlinedRequestsClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST with custom object in request body, response is an object - * - * @param {SeedExhaustive.PostWithObjectBody} request - * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.inlinedRequests.postWithObjectBodyandResponse({ - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); - } - - private async __postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/req-bodies/object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.PostWithObjectBody.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index 15d3f75bc67d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../index.js"; - -/** - * @example - * { - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * } - */ -export interface PostWithObjectBody { - string: string; - integer: number; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index 104f84256770..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts deleted file mode 100644 index 52430c224d0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts +++ /dev/null @@ -1,105 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoAuthClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoAuthClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: NoAuthClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST request with no auth - * - * @param {unknown} request - * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.noAuth.postWithNoAuth({ - * "key": "value" - * }) - */ - public postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); - } - - private async __postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-auth", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noAuth.postWithNoAuth.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts deleted file mode 100644 index 055fc0084e37..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts +++ /dev/null @@ -1,142 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoReqBodyClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoReqBodyClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: NoReqBodyClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.getWithNoRequestBody() - */ - public getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); - } - - private async __getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.postWithNoRequestBody() - */ - public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); - } - - private async __postWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "POST", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noReqBody.postWithNoRequestBody.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts deleted file mode 100644 index a645609a3c92..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace ReqWithHeadersClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ReqWithHeadersClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ReqWithHeadersClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.ReqWithHeaders} request - * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.reqWithHeaders.getWithCustomHeader({ - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * }) - */ - public getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); - } - - private async __getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): Promise> { - const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - mergeOnlyDefinedHeaders({ - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - }), - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/test-headers/custom-header", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.reqWithHeaders.getWithCustomHeader.Request.jsonOrThrow(_body, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts deleted file mode 100644 index b7fce3790bf5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * } - */ -export interface ReqWithHeaders { - xTestServiceHeader: string; - xTestEndpointHeader: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts deleted file mode 100644 index 5419b56cd667..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index ed458c66ba3c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,66 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithDocs { - /** - * Characters that could lead to broken generated SDKs: - * - * Markdown Escapes: - * - \_: Escaped underscore (e.g., FOO\_BAR) - * - \*: Escaped asterisk - * - * JSDoc (JavaScript/TypeScript): - * - @: Used for JSDoc tags - * - {: }: Used for type definitions - * - <: >: HTML tags - * - *: Can interfere with comment blocks - * - /**: JSDoc comment start - * - ** /: JSDoc comment end - * - &: HTML entities - * - * XMLDoc (C#): - * - <: >: XML tags - * - &: ': ": <: >: XML special characters - * - {: }: Used for interpolated strings - * - ///: Comment marker - * - /**: Block comment start - * - ** /: Block comment end - * - * Javadoc (Java): - * - @: Used for Javadoc tags - * - <: >: HTML tags - * - &: HTML entities - * - *: Can interfere with comment blocks - * - /**: Javadoc comment start - * - ** /: Javadoc comment end - * - * Doxygen (C++): - * - \: Used for Doxygen commands - * - @: Alternative command prefix - * - <: >: XML/HTML tags - * - &: HTML entities - * - /**: C-style comment start - * - ** /: C-style comment end - * - * RDoc (Ruby): - * - :: Used in symbol notation - * - =: Section markers - * - #: Comment marker - * - =begin: Block comment start - * - =end: Block comment end - * - @: Instance variable prefix - * - $: Global variable prefix - * - %: String literal delimiter - * - #{: String interpolation start - * - }: String interpolation end - * - * PHPDoc (PHP): - * - @: Used for PHPDoc tags - * - {: }: Used for type definitions - * - $: Variable prefix - * - /**: PHPDoc comment start - * - ** /: PHPDoc comment end - * - *: Can interfere with comment blocks - * - &: HTML entities - */ - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts deleted file mode 100644 index ef1aee2d386e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithEnumBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithEnumBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts deleted file mode 100644 index 203651bfb712..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index 4023a0068946..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const WeatherReport = { - Sunny: "SUNNY", - Cloudy: "CLOUDY", - Raining: "RAINING", - Snowing: "SNOWING", -} as const; -export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts deleted file mode 100644 index c2a44b58ecd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * from "./enum/errors/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * from "./object/errors/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * from "./union/errors/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts deleted file mode 100644 index 2681788e4f04..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts deleted file mode 100644 index 203710315112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts deleted file mode 100644 index 230964f8467f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts deleted file mode 100644 index b8a86dc99dd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts deleted file mode 100644 index e38a83090455..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./NestedObjectWithOptionalFieldError.js"; -export * from "./NestedObjectWithRequiredFieldError.js"; -export * from "./ObjectWithOptionalFieldError.js"; -export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index 4898ba728836..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface DoubleOptional { - optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index 324bb2e73908..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithOptionalField { - string?: string; - nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index 322dcfbd5c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithRequiredField { - string: string; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index b35138a717bb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithMapOfMap { - map: Record>; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 2e6b3811b575..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithOptionalField { - /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ - string?: string; - integer?: number; - long?: number; - double?: number; - bool?: boolean; - datetime?: Date; - date?: string; - uuid?: string; - base64?: string; - list?: string[]; - set?: Set; - map?: Record; - bigint?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index 032a84135c9e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithRequiredField { - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index 5dac5b761df8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts deleted file mode 100644 index c0e5b750495f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithUnionBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithUnionBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts deleted file mode 100644 index 940b191924ee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index f5336c6b33bc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; - -export namespace Animal { - export interface Dog extends SeedExhaustive.types.Dog { - animal: "dog"; - } - - export interface Cat extends SeedExhaustive.types.Cat { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index aa74d5b7dd01..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Cat { - name: string; - likesToMeow: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 24bc9aa321b1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Dog { - name: string; - likesToWoof: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts deleted file mode 100644 index b556b3f7bd94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../core/index.js"; -import * as errors from "../errors/index.js"; - -export namespace BearerAuthProvider { - export interface Options { - token?: core.Supplier; - } -} - -export class BearerAuthProvider implements core.AuthProvider { - private readonly token: core.Supplier; - - constructor(options: BearerAuthProvider.Options) { - this.token = options.token; - } - - public static canCreate(options: BearerAuthProvider.Options): boolean { - return options.token != null; - } - - public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { - const token = await core.Supplier.get(this.token); - if (token == null) { - throw new errors.SeedExhaustiveError({ - message: "Please specify a token by passing it in to the constructor", - }); - } - - return { - headers: { Authorization: `Bearer ${token}` }, - }; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts deleted file mode 100644 index 0ecb12b79bdb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts deleted file mode 100644 index 895a50ff30da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export interface AuthProvider { - getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts deleted file mode 100644 index f6218b42211e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Request parameters for authentication requests. - */ -export interface AuthRequest { - /** - * The headers to be included in the request. - */ - headers: Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts deleted file mode 100644 index a64235910062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { base64Decode, base64Encode } from "../base64.js"; - -export interface BasicAuth { - username: string; - password: string; -} - -const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; - -export const BasicAuth = { - toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { - if (basicAuth == null) { - return undefined; - } - const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); - return `Basic ${token}`; - }, - fromAuthorizationHeader: (header: string): BasicAuth => { - const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); - const decoded = base64Decode(credentials); - const [username, ...passwordParts] = decoded.split(":"); - const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; - - if (username == null || password == null) { - throw new Error("Invalid basic auth"); - } - return { - username, - password, - }; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts deleted file mode 100644 index c44a06c38f06..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type BearerToken = string; - -const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; - -function toAuthorizationHeader(token: string | undefined): string | undefined { - if (token == null) { - return undefined; - } - return `Bearer ${token}`; -} - -export const BearerToken: { - toAuthorizationHeader: typeof toAuthorizationHeader; - fromAuthorizationHeader: (header: string) => BearerToken; -} = { - toAuthorizationHeader: toAuthorizationHeader, - fromAuthorizationHeader: (header: string): BearerToken => { - return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts deleted file mode 100644 index 5b7acfd2bd8b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { AuthProvider } from "./AuthProvider.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export class NoOpAuthProvider implements AuthProvider { - public getAuthRequest(): Promise { - return Promise.resolve({ headers: {} }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts deleted file mode 100644 index 2215b227709e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { AuthProvider } from "./AuthProvider.js"; -export type { AuthRequest } from "./AuthRequest.js"; -export { BasicAuth } from "./BasicAuth.js"; -export { BearerToken } from "./BearerToken.js"; -export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts deleted file mode 100644 index 448a0db638a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts +++ /dev/null @@ -1,27 +0,0 @@ -function base64ToBytes(base64: string): Uint8Array { - const binString = atob(base64); - return Uint8Array.from(binString, (m) => m.codePointAt(0)!); -} - -function bytesToBase64(bytes: Uint8Array): string { - const binString = String.fromCodePoint(...bytes); - return btoa(binString); -} - -export function base64Encode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "utf8").toString("base64"); - } - - const bytes = new TextEncoder().encode(input); - return bytesToBase64(bytes); -} - -export function base64Decode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "base64").toString("utf8"); - } - - const bytes = base64ToBytes(input); - return new TextDecoder().decode(bytes); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts deleted file mode 100644 index 69296d7100d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts deleted file mode 100644 index 97ab83c2b195..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RawResponse } from "./RawResponse.js"; - -/** - * The response of an API call. - * It is a successful response or a failed response. - */ -export type APIResponse = SuccessfulResponse | FailedResponse; - -export interface SuccessfulResponse { - ok: true; - body: T; - /** - * @deprecated Use `rawResponse` instead - */ - headers?: Record; - rawResponse: RawResponse; -} - -export interface FailedResponse { - ok: false; - error: T; - rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts deleted file mode 100644 index bca7f4c77981..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type BinaryResponse = { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - bodyUsed: Response["bodyUsed"]; - /** - * Returns a ReadableStream of the response body. - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) - */ - stream: () => Response["body"]; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer: () => ReturnType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob: () => ReturnType; - /** - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) - * Some versions of the Fetch API may not support this method. - */ - bytes?(): ReturnType; -}; - -export function getBinaryResponse(response: Response): BinaryResponse { - const binaryResponse: BinaryResponse = { - get bodyUsed() { - return response.bodyUsed; - }, - stream: () => response.body, - arrayBuffer: response.arrayBuffer.bind(response), - blob: response.blob.bind(response), - }; - if ("bytes" in response && typeof response.bytes === "function") { - binaryResponse.bytes = response.bytes.bind(response); - } - - return binaryResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts deleted file mode 100644 index 998d68f5c20c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type SecuritySchemeKey = string; -/** - * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. - * All schemes in the collection must be satisfied for authentication to be successful. - */ -export type SecuritySchemeCollection = Record; -export type AuthScope = string; -export type EndpointMetadata = { - /** - * An array of security scheme collections. Each collection represents an alternative way to authenticate. - */ - security?: SecuritySchemeCollection[]; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts deleted file mode 100644 index 8079841c4062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import type { Supplier } from "./Supplier.js"; - -type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; -export type EndpointSupplier = Supplier | EndpointSupplierFn; -export const EndpointSupplier = { - get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { - if (typeof supplier === "function") { - return (supplier as EndpointSupplierFn)(arg); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts deleted file mode 100644 index 58bb0e3ef7d9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts +++ /dev/null @@ -1,391 +0,0 @@ -import { toJson } from "../json.js"; -import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; -import type { APIResponse } from "./APIResponse.js"; -import { createRequestUrl } from "./createRequestUrl.js"; -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import { EndpointSupplier } from "./EndpointSupplier.js"; -import { getErrorResponseBody } from "./getErrorResponseBody.js"; -import { getFetchFn } from "./getFetchFn.js"; -import { getRequestBody } from "./getRequestBody.js"; -import { getResponseBody } from "./getResponseBody.js"; -import { Headers } from "./Headers.js"; -import { makeRequest } from "./makeRequest.js"; -import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -import { requestWithRetries } from "./requestWithRetries.js"; - -export type FetchFunction = (args: Fetcher.Args) => Promise>; - -export declare namespace Fetcher { - export interface Args { - url: string; - method: string; - contentType?: string; - headers?: Record | null | undefined>; - queryParameters?: Record; - body?: unknown; - timeoutMs?: number; - maxRetries?: number; - withCredentials?: boolean; - abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes" | "form" | "other"; - responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; - duplex?: "half"; - endpointMetadata?: EndpointMetadata; - fetchFn?: typeof fetch; - logging?: LogConfig | Logger; - } - - export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; - - export interface FailedStatusCodeError { - reason: "status-code"; - statusCode: number; - body: unknown; - } - - export interface NonJsonError { - reason: "non-json"; - statusCode: number; - rawBody: string; - } - - export interface BodyIsNullError { - reason: "body-is-null"; - statusCode: number; - } - - export interface TimeoutError { - reason: "timeout"; - } - - export interface UnknownError { - reason: "unknown"; - errorMessage: string; - } -} - -const SENSITIVE_HEADERS = new Set([ - "authorization", - "www-authenticate", - "x-api-key", - "api-key", - "apikey", - "x-api-token", - "x-auth-token", - "auth-token", - "cookie", - "set-cookie", - "proxy-authorization", - "proxy-authenticate", - "x-csrf-token", - "x-xsrf-token", - "x-session-token", - "x-access-token", -]); - -function redactHeaders(headers: Headers | Record): Record { - const filtered: Record = {}; - for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { - if (SENSITIVE_HEADERS.has(key.toLowerCase())) { - filtered[key] = "[REDACTED]"; - } else { - filtered[key] = value; - } - } - return filtered; -} - -const SENSITIVE_QUERY_PARAMS = new Set([ - "api_key", - "api-key", - "apikey", - "token", - "access_token", - "access-token", - "auth_token", - "auth-token", - "password", - "passwd", - "secret", - "api_secret", - "api-secret", - "apisecret", - "key", - "session", - "session_id", - "session-id", -]); - -function redactQueryParameters(queryParameters?: Record): Record | undefined { - if (queryParameters == null) { - return queryParameters; - } - const redacted: Record = {}; - for (const [key, value] of Object.entries(queryParameters)) { - if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { - redacted[key] = "[REDACTED]"; - } else { - redacted[key] = value; - } - } - return redacted; -} - -function redactUrl(url: string): string { - const protocolIndex = url.indexOf("://"); - if (protocolIndex === -1) return url; - - const afterProtocol = protocolIndex + 3; - - // Find the first delimiter that marks the end of the authority section - const pathStart = url.indexOf("/", afterProtocol); - let queryStart = url.indexOf("?", afterProtocol); - let fragmentStart = url.indexOf("#", afterProtocol); - - const firstDelimiter = Math.min( - pathStart === -1 ? url.length : pathStart, - queryStart === -1 ? url.length : queryStart, - fragmentStart === -1 ? url.length : fragmentStart, - ); - - // Find the LAST @ before the delimiter (handles multiple @ in credentials) - let atIndex = -1; - for (let i = afterProtocol; i < firstDelimiter; i++) { - if (url[i] === "@") { - atIndex = i; - } - } - - if (atIndex !== -1) { - url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; - } - - // Recalculate queryStart since url might have changed - queryStart = url.indexOf("?"); - if (queryStart === -1) return url; - - fragmentStart = url.indexOf("#", queryStart); - const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; - const queryString = url.slice(queryStart + 1, queryEnd); - - if (queryString.length === 0) return url; - - // FAST PATH: Quick check if any sensitive keywords present - // Using indexOf is faster than regex for simple substring matching - const lower = queryString.toLowerCase(); - const hasSensitive = - lower.includes("token") || - lower.includes("key") || - lower.includes("password") || - lower.includes("passwd") || - lower.includes("secret") || - lower.includes("session") || - lower.includes("auth"); - - if (!hasSensitive) { - return url; - } - - // SLOW PATH: Parse and redact - const redactedParams: string[] = []; - const params = queryString.split("&"); - - for (const param of params) { - const equalIndex = param.indexOf("="); - if (equalIndex === -1) { - redactedParams.push(param); - continue; - } - - const key = param.slice(0, equalIndex); - let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); - - if (!shouldRedact && key.includes("%")) { - try { - const decodedKey = decodeURIComponent(key); - shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); - } catch {} - } - - redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); - } - - return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); -} - -async function getHeaders(args: Fetcher.Args): Promise { - const newHeaders: Headers = new Headers(); - - newHeaders.set( - "Accept", - args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", - ); - if (args.body !== undefined && args.contentType != null) { - newHeaders.set("Content-Type", args.contentType); - } - - if (args.headers == null) { - return newHeaders; - } - - for (const [key, value] of Object.entries(args.headers)) { - const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); - if (typeof result === "string") { - newHeaders.set(key, result); - continue; - } - if (result == null) { - continue; - } - newHeaders.set(key, `${result}`); - } - return newHeaders; -} - -export async function fetcherImpl(args: Fetcher.Args): Promise> { - const url = createRequestUrl(args.url, args.queryParameters); - const requestBody: BodyInit | undefined = await getRequestBody({ - body: args.body, - type: args.requestType ?? "other", - }); - const fetchFn = args.fetchFn ?? (await getFetchFn()); - const headers = await getHeaders(args); - const logger = createLogger(args.logging); - - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - headers: redactHeaders(headers), - queryParameters: redactQueryParameters(args.queryParameters), - hasBody: requestBody != null, - }; - logger.debug("Making HTTP request", metadata); - } - - try { - const response = await requestWithRetries( - async () => - makeRequest( - fetchFn, - url, - args.method, - headers, - requestBody, - args.timeoutMs, - args.abortSignal, - args.withCredentials, - args.duplex, - ), - args.maxRetries, - ); - - if (response.status >= 200 && response.status < 400) { - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(response.headers), - }; - logger.debug("HTTP request succeeded", metadata); - } - const body = await getResponseBody(response, args.responseType); - return { - ok: true, - body: body as R, - headers: response.headers, - rawResponse: toRawResponse(response), - }; - } else { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), - }; - logger.error("HTTP request failed with error status", metadata); - } - return { - ok: false, - error: { - reason: "status-code", - statusCode: response.status, - body: await getErrorResponseBody(response), - }, - rawResponse: toRawResponse(response), - }; - } - } catch (error) { - if (args.abortSignal?.aborted) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - }; - logger.error("HTTP request was aborted", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: "The user aborted a request", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error && error.name === "AbortError") { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - timeoutMs: args.timeoutMs, - }; - logger.error("HTTP request timed out", metadata); - } - return { - ok: false, - error: { - reason: "timeout", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - errorMessage: error.message, - }; - logger.error("HTTP request failed with error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: error.message, - }, - rawResponse: unknownRawResponse, - }; - } - - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - error: toJson(error), - }; - logger.error("HTTP request failed with unknown error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: toJson(error), - }, - rawResponse: unknownRawResponse, - }; - } -} - -export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts deleted file mode 100644 index af841aa24f55..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts +++ /dev/null @@ -1,93 +0,0 @@ -let Headers: typeof globalThis.Headers; - -if (typeof globalThis.Headers !== "undefined") { - Headers = globalThis.Headers; -} else { - Headers = class Headers implements Headers { - private headers: Map; - - constructor(init?: HeadersInit) { - this.headers = new Map(); - - if (init) { - if (init instanceof Headers) { - init.forEach((value, key) => this.append(key, value)); - } else if (Array.isArray(init)) { - for (const [key, value] of init) { - if (typeof key === "string" && typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Each header entry must be a [string, string] tuple"); - } - } - } else { - for (const [key, value] of Object.entries(init)) { - if (typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Header values must be strings"); - } - } - } - } - } - - append(name: string, value: string): void { - const key = name.toLowerCase(); - const existing = this.headers.get(key) || []; - this.headers.set(key, [...existing, value]); - } - - delete(name: string): void { - const key = name.toLowerCase(); - this.headers.delete(key); - } - - get(name: string): string | null { - const key = name.toLowerCase(); - const values = this.headers.get(key); - return values ? values.join(", ") : null; - } - - has(name: string): boolean { - const key = name.toLowerCase(); - return this.headers.has(key); - } - - set(name: string, value: string): void { - const key = name.toLowerCase(); - this.headers.set(key, [value]); - } - - forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { - const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; - this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); - } - - getSetCookie(): string[] { - return this.headers.get("set-cookie") || []; - } - - *entries(): HeadersIterator<[string, string]> { - for (const [key, values] of this.headers.entries()) { - yield [key, values.join(", ")]; - } - } - - *keys(): HeadersIterator { - yield* this.headers.keys(); - } - - *values(): HeadersIterator { - for (const values of this.headers.values()) { - yield values.join(", "); - } - } - - [Symbol.iterator](): HeadersIterator<[string, string]> { - return this.entries(); - } - }; -} - -export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts deleted file mode 100644 index 692ca7d795f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { WithRawResponse } from "./RawResponse.js"; - -/** - * A promise that returns the parsed response and lets you retrieve the raw response too. - */ -export class HttpResponsePromise extends Promise { - private innerPromise: Promise>; - private unwrappedPromise: Promise | undefined; - - private constructor(promise: Promise>) { - // Initialize with a no-op to avoid premature parsing - super((resolve) => { - resolve(undefined as unknown as T); - }); - this.innerPromise = promise; - } - - /** - * Creates an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @param args - Arguments to pass to the function. - * @returns An `HttpResponsePromise` instance. - */ - public static fromFunction Promise>, T>( - fn: F, - ...args: Parameters - ): HttpResponsePromise { - return new HttpResponsePromise(fn(...args)); - } - - /** - * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @returns A function that returns an `HttpResponsePromise` instance. - */ - public static interceptFunction< - F extends (...args: never[]) => Promise>, - T = Awaited>["data"], - >(fn: F): (...args: Parameters) => HttpResponsePromise { - return (...args: Parameters): HttpResponsePromise => { - return HttpResponsePromise.fromPromise(fn(...args)); - }; - } - - /** - * Creates an `HttpResponsePromise` from an existing promise. - * - * @param promise - A promise resolving to a `WithRawResponse` object. - * @returns An `HttpResponsePromise` instance. - */ - public static fromPromise(promise: Promise>): HttpResponsePromise { - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from an executor function. - * - * @param executor - A function that takes resolve and reject callbacks to create a promise. - * @returns An `HttpResponsePromise` instance. - */ - public static fromExecutor( - executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, - ): HttpResponsePromise { - const promise = new Promise>(executor); - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from a resolved result. - * - * @param result - A `WithRawResponse` object to resolve immediately. - * @returns An `HttpResponsePromise` instance. - */ - public static fromResult(result: WithRawResponse): HttpResponsePromise { - const promise = Promise.resolve(result); - return new HttpResponsePromise(promise); - } - - private unwrap(): Promise { - if (!this.unwrappedPromise) { - this.unwrappedPromise = this.innerPromise.then(({ data }) => data); - } - return this.unwrappedPromise; - } - - /** @inheritdoc */ - public override then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, - ): Promise { - return this.unwrap().then(onfulfilled, onrejected); - } - - /** @inheritdoc */ - public override catch( - onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, - ): Promise { - return this.unwrap().catch(onrejected); - } - - /** @inheritdoc */ - public override finally(onfinally?: (() => void) | null): Promise { - return this.unwrap().finally(onfinally); - } - - /** - * Retrieves the data and raw response. - * - * @returns A promise resolving to a `WithRawResponse` object. - */ - public async withRawResponse(): Promise> { - return await this.innerPromise; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts deleted file mode 100644 index 37fb44e2aa99..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Headers } from "./Headers.js"; - -/** - * The raw response from the fetch call excluding the body. - */ -export type RawResponse = Omit< - { - [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions - }, - "ok" | "body" | "bodyUsed" ->; // strips out body and bodyUsed - -/** - * A raw response indicating that the request was aborted. - */ -export const abortRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 499, - statusText: "Client Closed Request", - type: "error", - url: "", -} as const; - -/** - * A raw response indicating an unknown error. - */ -export const unknownRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 0, - statusText: "Unknown Error", - type: "error", - url: "", -} as const; - -/** - * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, - * excluding the `body` and `bodyUsed` fields. - * - * @param response - The `RawResponse` object to convert. - * @returns A `RawResponse` object containing the extracted properties of the input response. - */ -export function toRawResponse(response: Response): RawResponse { - return { - headers: response.headers, - redirected: response.redirected, - status: response.status, - statusText: response.statusText, - type: response.type, - url: response.url, - }; -} - -/** - * Creates a `RawResponse` from a standard `Response` object. - */ -export interface WithRawResponse { - readonly data: T; - readonly rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts deleted file mode 100644 index 867c931c02f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type Supplier = T | Promise | (() => T | Promise); - -export const Supplier = { - get: async (supplier: Supplier): Promise => { - if (typeof supplier === "function") { - return (supplier as () => T)(); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts deleted file mode 100644 index 88e13265e112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { toQueryString } from "../url/qs.js"; - -export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { - const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); - return queryString ? `${baseUrl}?${queryString}` : baseUrl; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts deleted file mode 100644 index 7cf4e623c2f5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { fromJson } from "../json.js"; -import { getResponseBody } from "./getResponseBody.js"; - -export async function getErrorResponseBody(response: Response): Promise { - let contentType = response.headers.get("Content-Type")?.toLowerCase(); - if (contentType == null || contentType.length === 0) { - return getResponseBody(response); - } - - if (contentType.indexOf(";") !== -1) { - contentType = contentType.split(";")[0]?.trim() ?? ""; - } - switch (contentType) { - case "application/hal+json": - case "application/json": - case "application/ld+json": - case "application/problem+json": - case "application/vnd.api+json": - case "text/json": { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - default: - if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - - // Fallback to plain text if content type is not recognized - // Even if no body is present, the response will be an empty string - return await response.text(); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts deleted file mode 100644 index 9f845b956392..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function getFetchFn(): Promise { - return fetch; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts deleted file mode 100644 index 50f922b0e87f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function getHeader(headers: Record, header: string): string | undefined { - for (const [headerKey, headerValue] of Object.entries(headers)) { - if (headerKey.toLowerCase() === header.toLowerCase()) { - return headerValue; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts deleted file mode 100644 index 91d9d81f50e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toJson } from "../json.js"; -import { toQueryString } from "../url/qs.js"; - -export declare namespace GetRequestBody { - interface Args { - body: unknown; - type: "json" | "file" | "bytes" | "form" | "other"; - } -} - -export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { - if (type === "form") { - return toQueryString(body, { arrayFormat: "repeat", encode: true }); - } - if (type.includes("json")) { - return toJson(body); - } else { - return body as BodyInit; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts deleted file mode 100644 index 708d55728f2b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { fromJson } from "../json.js"; -import { getBinaryResponse } from "./BinaryResponse.js"; - -export async function getResponseBody(response: Response, responseType?: string): Promise { - switch (responseType) { - case "binary-response": - return getBinaryResponse(response); - case "blob": - return await response.blob(); - case "arrayBuffer": - return await response.arrayBuffer(); - case "sse": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - return response.body; - case "streaming": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - - return response.body; - - case "text": - return await response.text(); - } - - // if responseType is "json" or not specified, try to parse as JSON - const text = await response.text(); - if (text.length > 0) { - try { - const responseBody = fromJson(text); - return responseBody; - } catch (_err) { - return { - ok: false, - error: { - reason: "non-json", - statusCode: response.status, - rawBody: text, - }, - }; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts deleted file mode 100644 index c3bc6da20f49..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type { APIResponse } from "./APIResponse.js"; -export type { BinaryResponse } from "./BinaryResponse.js"; -export type { EndpointMetadata } from "./EndpointMetadata.js"; -export { EndpointSupplier } from "./EndpointSupplier.js"; -export type { Fetcher, FetchFunction } from "./Fetcher.js"; -export { fetcher } from "./Fetcher.js"; -export { getHeader } from "./getHeader.js"; -export { HttpResponsePromise } from "./HttpResponsePromise.js"; -export type { RawResponse, WithRawResponse } from "./RawResponse.js"; -export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts deleted file mode 100644 index 921565eb0063..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { anySignal, getTimeoutSignal } from "./signals.js"; - -export const makeRequest = async ( - fetchFn: (url: string, init: RequestInit) => Promise, - url: string, - method: string, - headers: Headers | Record, - requestBody: BodyInit | undefined, - timeoutMs?: number, - abortSignal?: AbortSignal, - withCredentials?: boolean, - duplex?: "half", -): Promise => { - const signals: AbortSignal[] = []; - - let timeoutAbortId: ReturnType | undefined; - if (timeoutMs != null) { - const { signal, abortId } = getTimeoutSignal(timeoutMs); - timeoutAbortId = abortId; - signals.push(signal); - } - - if (abortSignal != null) { - signals.push(abortSignal); - } - const newSignals = anySignal(signals); - const response = await fetchFn(url, { - method: method, - headers, - body: requestBody, - signal: newSignals, - credentials: withCredentials ? "include" : undefined, - // @ts-ignore - duplex, - }); - - if (timeoutAbortId != null) { - clearTimeout(timeoutAbortId); - } - - return response; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts deleted file mode 100644 index 1f689688c4b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts +++ /dev/null @@ -1,64 +0,0 @@ -const INITIAL_RETRY_DELAY = 1000; // in milliseconds -const MAX_RETRY_DELAY = 60000; // in milliseconds -const DEFAULT_MAX_RETRIES = 2; -const JITTER_FACTOR = 0.2; // 20% random jitter - -function addPositiveJitter(delay: number): number { - const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function addSymmetricJitter(delay: number): number { - const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { - const retryAfter = response.headers.get("Retry-After"); - if (retryAfter) { - const retryAfterSeconds = parseInt(retryAfter, 10); - if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { - return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); - } - - const retryAfterDate = new Date(retryAfter); - if (!Number.isNaN(retryAfterDate.getTime())) { - const delay = retryAfterDate.getTime() - Date.now(); - if (delay > 0) { - return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); - } - } - } - - const rateLimitReset = response.headers.get("X-RateLimit-Reset"); - if (rateLimitReset) { - const resetTime = parseInt(rateLimitReset, 10); - if (!Number.isNaN(resetTime)) { - const delay = resetTime * 1000 - Date.now(); - if (delay > 0) { - return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); - } - } - } - - return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); -} - -export async function requestWithRetries( - requestFn: () => Promise, - maxRetries: number = DEFAULT_MAX_RETRIES, -): Promise { - let response: Response = await requestFn(); - - for (let i = 0; i < maxRetries; ++i) { - if ([408, 429].includes(response.status) || response.status >= 500) { - const delay = getRetryDelayFromHeaders(response, i); - - await new Promise((resolve) => setTimeout(resolve, delay)); - response = await requestFn(); - } else { - break; - } - } - return response!; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts deleted file mode 100644 index 7bd3757ec3a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts +++ /dev/null @@ -1,26 +0,0 @@ -const TIMEOUT = "timeout"; - -export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { - const controller = new AbortController(); - const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); - return { signal: controller.signal, abortId }; -} - -export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { - const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; - - const controller = new AbortController(); - - for (const signal of signals) { - if (signal.aborted) { - controller.abort((signal as any)?.reason); - break; - } - - signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { - signal: controller.signal, - }); - } - - return controller.signal; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts deleted file mode 100644 index 78ed8b500c95..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts +++ /dev/null @@ -1,35 +0,0 @@ -export function mergeHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } else if (insensitiveKey in result) { - delete result[insensitiveKey]; - } - } - - return result; -} - -export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } - } - - return result; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts deleted file mode 100644 index 874173e71808..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./auth/index.js"; -export * from "./base64.js"; -export * from "./fetcher/index.js"; -export * as logging from "./logging/index.js"; -export * from "./runtime/index.js"; -export * as serialization from "./schemas/index.js"; -export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts deleted file mode 100644 index c052f3249f4f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Serialize a value to JSON - * @param value A JavaScript value, usually an object or array, to be converted. - * @param replacer A function that transforms the results. - * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. - * @returns JSON string - */ -export const toJson = ( - value: unknown, - replacer?: (this: unknown, key: string, value: unknown) => unknown, - space?: string | number, -): string => { - return JSON.stringify(value, replacer, space); -}; - -/** - * Parse JSON string to object, array, or other type - * @param text A valid JSON string. - * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. - * @returns Parsed object, array, or other type - */ -export function fromJson( - text: string, - reviver?: (this: unknown, key: string, value: unknown) => unknown, -): T { - return JSON.parse(text, reviver); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts deleted file mode 100644 index 88f6c00db0cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as logger from "./logger.js"; - -export namespace logging { - /** - * Configuration for logger instances. - */ - export type LogConfig = logger.LogConfig; - export type LogLevel = logger.LogLevel; - export const LogLevel: typeof logger.LogLevel = logger.LogLevel; - export type ILogger = logger.ILogger; - /** - * Console logger implementation that outputs to the console. - */ - export type ConsoleLogger = logger.ConsoleLogger; - /** - * Console logger implementation that outputs to the console. - */ - export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts deleted file mode 100644 index d81cc32c40f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts deleted file mode 100644 index a3f3673cda93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts +++ /dev/null @@ -1,203 +0,0 @@ -export const LogLevel = { - Debug: "debug", - Info: "info", - Warn: "warn", - Error: "error", -} as const; -export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; -const logLevelMap: Record = { - [LogLevel.Debug]: 1, - [LogLevel.Info]: 2, - [LogLevel.Warn]: 3, - [LogLevel.Error]: 4, -}; - -export interface ILogger { - /** - * Logs a debug message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - debug(message: string, ...args: unknown[]): void; - /** - * Logs an info message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - info(message: string, ...args: unknown[]): void; - /** - * Logs a warning message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - warn(message: string, ...args: unknown[]): void; - /** - * Logs an error message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - error(message: string, ...args: unknown[]): void; -} - -/** - * Configuration for logger initialization. - */ -export interface LogConfig { - /** - * Minimum log level to output. - * @default LogLevel.Info - */ - level?: LogLevel; - /** - * Logger implementation to use. - * @default new ConsoleLogger() - */ - logger?: ILogger; - /** - * Whether logging should be silenced. - * @default true - */ - silent?: boolean; -} - -/** - * Default console-based logger implementation. - */ -export class ConsoleLogger implements ILogger { - debug(message: string, ...args: unknown[]): void { - console.debug(message, ...args); - } - info(message: string, ...args: unknown[]): void { - console.info(message, ...args); - } - warn(message: string, ...args: unknown[]): void { - console.warn(message, ...args); - } - error(message: string, ...args: unknown[]): void { - console.error(message, ...args); - } -} - -/** - * Logger class that provides level-based logging functionality. - */ -export class Logger { - private readonly level: number; - private readonly logger: ILogger; - private readonly silent: boolean; - - /** - * Creates a new logger instance. - * @param config - Logger configuration - */ - constructor(config: Required) { - this.level = logLevelMap[config.level]; - this.logger = config.logger; - this.silent = config.silent; - } - - /** - * Checks if a log level should be output based on configuration. - * @param level - The log level to check - * @returns True if the level should be logged - */ - public shouldLog(level: LogLevel): boolean { - return !this.silent && this.level <= logLevelMap[level]; - } - - /** - * Checks if debug logging is enabled. - * @returns True if debug logs should be output - */ - public isDebug(): boolean { - return this.shouldLog(LogLevel.Debug); - } - - /** - * Logs a debug message if debug logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public debug(message: string, ...args: unknown[]): void { - if (this.isDebug()) { - this.logger.debug(message, ...args); - } - } - - /** - * Checks if info logging is enabled. - * @returns True if info logs should be output - */ - public isInfo(): boolean { - return this.shouldLog(LogLevel.Info); - } - - /** - * Logs an info message if info logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public info(message: string, ...args: unknown[]): void { - if (this.isInfo()) { - this.logger.info(message, ...args); - } - } - - /** - * Checks if warning logging is enabled. - * @returns True if warning logs should be output - */ - public isWarn(): boolean { - return this.shouldLog(LogLevel.Warn); - } - - /** - * Logs a warning message if warning logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public warn(message: string, ...args: unknown[]): void { - if (this.isWarn()) { - this.logger.warn(message, ...args); - } - } - - /** - * Checks if error logging is enabled. - * @returns True if error logs should be output - */ - public isError(): boolean { - return this.shouldLog(LogLevel.Error); - } - - /** - * Logs an error message if error logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public error(message: string, ...args: unknown[]): void { - if (this.isError()) { - this.logger.error(message, ...args); - } - } -} - -export function createLogger(config?: LogConfig | Logger): Logger { - if (config == null) { - return defaultLogger; - } - if (config instanceof Logger) { - return config; - } - config = config ?? {}; - config.level ??= LogLevel.Info; - config.logger ??= new ConsoleLogger(); - config.silent ??= true; - return new Logger(config as Required); -} - -const defaultLogger: Logger = new Logger({ - level: LogLevel.Info, - logger: new ConsoleLogger(), - silent: true, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts deleted file mode 100644 index cfab23f9a834..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts deleted file mode 100644 index 56ebbb87c4d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts +++ /dev/null @@ -1,134 +0,0 @@ -interface DenoGlobal { - version: { - deno: string; - }; -} - -interface BunGlobal { - version: string; -} - -declare const Deno: DenoGlobal | undefined; -declare const Bun: BunGlobal | undefined; -declare const EdgeRuntime: string | undefined; -declare const self: typeof globalThis.self & { - importScripts?: unknown; -}; - -/** - * A constant that indicates which environment and version the SDK is running in. - */ -export const RUNTIME: Runtime = evaluateRuntime(); - -export interface Runtime { - type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; - version?: string; - parsedVersion?: number; -} - -function evaluateRuntime(): Runtime { - /** - * A constant that indicates whether the environment the code is running is a Web Browser. - */ - const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - if (isBrowser) { - return { - type: "browser", - version: window.navigator.userAgent, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Cloudflare. - * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent - */ - const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; - if (isCloudflare) { - return { - type: "workerd", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Edge Runtime. - * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime - */ - const isEdgeRuntime = typeof EdgeRuntime === "string"; - if (isEdgeRuntime) { - return { - type: "edge-runtime", - }; - } - - /** - * A constant that indicates whether the environment the code is running is a Web Worker. - */ - const isWebWorker = - typeof self === "object" && - typeof self?.importScripts === "function" && - (self.constructor?.name === "DedicatedWorkerGlobalScope" || - self.constructor?.name === "ServiceWorkerGlobalScope" || - self.constructor?.name === "SharedWorkerGlobalScope"); - if (isWebWorker) { - return { - type: "web-worker", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Deno. - * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions - */ - const isDeno = - typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - if (isDeno) { - return { - type: "deno", - version: Deno.version.deno, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Bun.sh. - */ - const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; - if (isBun) { - return { - type: "bun", - version: Bun.version, - }; - } - - /** - * A constant that indicates whether the environment the code is running is in React-Native. - * This check should come before Node.js detection since React Native may have a process polyfill. - * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js - */ - const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; - if (isReactNative) { - return { - type: "react-native", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ - const isNode = - typeof process !== "undefined" && - "version" in process && - !!process.version && - "versions" in process && - !!process.versions?.node; - if (isNode) { - return { - type: "node", - version: process.versions.node, - parsedVersion: Number(process.versions.node.split(".")[0]), - }; - } - - return { - type: "unknown", - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts deleted file mode 100644 index 4cd8b1d95934..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { SchemaUtils } from "./builders/index.js"; - -export type Schema = BaseSchema & SchemaUtils; - -export type inferRaw = S extends Schema ? Raw : never; -export type inferParsed = S extends Schema ? Parsed : never; - -export interface BaseSchema { - parse: (raw: unknown, opts?: SchemaOptions) => MaybeValid; - json: (parsed: unknown, opts?: SchemaOptions) => MaybeValid; - getType: () => SchemaType | SchemaType; -} - -export const SchemaType = { - BIGINT: "bigint", - DATE: "date", - ENUM: "enum", - LIST: "list", - STRING_LITERAL: "stringLiteral", - BOOLEAN_LITERAL: "booleanLiteral", - OBJECT: "object", - ANY: "any", - BOOLEAN: "boolean", - NUMBER: "number", - STRING: "string", - UNKNOWN: "unknown", - NEVER: "never", - RECORD: "record", - SET: "set", - UNION: "union", - UNDISCRIMINATED_UNION: "undiscriminatedUnion", - NULLABLE: "nullable", - OPTIONAL: "optional", - OPTIONAL_NULLABLE: "optionalNullable", -} as const; - -export type SchemaType = (typeof SchemaType)[keyof typeof SchemaType]; - -export type MaybeValid = Valid | Invalid; - -export interface Valid { - ok: true; - value: T; -} - -export interface Invalid { - ok: false; - errors: ValidationError[]; -} - -export interface ValidationError { - path: string[]; - message: string; -} - -export interface SchemaOptions { - /** - * how to handle unrecognized keys in objects - * - * @default "fail" - */ - unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; - - /** - * whether to fail when an unrecognized discriminant value is - * encountered in a union - * - * @default false - */ - allowUnrecognizedUnionMembers?: boolean; - - /** - * whether to fail when an unrecognized enum value is encountered - * - * @default false - */ - allowUnrecognizedEnumValues?: boolean; - - /** - * whether to allow data that doesn't conform to the schema. - * invalid data is passed through without transformation. - * - * when this is enabled, .parse() and .json() will always - * return `ok: true`. `.parseOrThrow()` and `.jsonOrThrow()` - * will never fail. - * - * @default false - */ - skipValidation?: boolean; - - /** - * each validation failure contains a "path" property, which is - * the breadcrumbs to the offending node in the JSON. you can supply - * a prefix that is prepended to all the errors' paths. this can be - * helpful for zurg's internal debug logging. - */ - breadcrumbsPrefix?: string[]; - - /** - * whether to send 'null' for optional properties explicitly set to 'undefined'. - */ - omitUndefined?: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts deleted file mode 100644 index 2c7c74c54a37..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export function bigint(): Schema { - const baseSchema: BaseSchema = { - parse: (raw, { breadcrumbsPrefix = [] } = {}) => { - if (typeof raw === "bigint") { - return { - ok: true, - value: raw, - }; - } - if (typeof raw === "number") { - return { - ok: true, - value: BigInt(raw), - }; - } - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(raw, "bigint | number"), - }, - ], - }; - }, - json: (bigint, { breadcrumbsPrefix = [] } = {}) => { - if (typeof bigint !== "bigint") { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(bigint, "bigint"), - }, - ], - }; - } - return { - ok: true, - value: bigint, - }; - }, - getType: () => SchemaType.BIGINT, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts deleted file mode 100644 index 13cc76e25b2a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { bigint } from "./bigint.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts deleted file mode 100644 index f02e3367f88f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -// https://stackoverflow.com/questions/12756159/regex-and-iso8601-formatted-datetime -const ISO_8601_REGEX = - /^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([.,]\d+(?!:))?)?(\17[0-5]\d([.,]\d+)?)?([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; - -export function date(): Schema { - const baseSchema: BaseSchema = { - parse: (raw, { breadcrumbsPrefix = [] } = {}) => { - if (typeof raw !== "string") { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(raw, "string"), - }, - ], - }; - } - if (!ISO_8601_REGEX.test(raw)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(raw, "ISO 8601 date string"), - }, - ], - }; - } - return { - ok: true, - value: new Date(raw), - }; - }, - json: (date, { breadcrumbsPrefix = [] } = {}) => { - if (date instanceof Date) { - return { - ok: true, - value: date.toISOString(), - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(date, "Date object"), - }, - ], - }; - } - }, - getType: () => SchemaType.DATE, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts deleted file mode 100644 index e22a2f16bfc9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { date } from "./date.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts deleted file mode 100644 index ccae24bcf200..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export function enum_(values: E): Schema { - const validValues = new Set(values); - - const schemaCreator = createIdentitySchemaCreator( - SchemaType.ENUM, - (value, { allowUnrecognizedEnumValues, breadcrumbsPrefix = [] } = {}) => { - if (typeof value !== "string") { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "string"), - }, - ], - }; - } - - if (!validValues.has(value) && !allowUnrecognizedEnumValues) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "enum"), - }, - ], - }; - } - - return { - ok: true, - value: value as U, - }; - }, - ); - - return schemaCreator(); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts deleted file mode 100644 index ff3bee3bf653..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { enum_ } from "./enum.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts deleted file mode 100644 index ddb9b3c94555..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export * from "./bigint/index.js"; -export * from "./date/index.js"; -export * from "./enum/index.js"; -export * from "./lazy/index.js"; -export * from "./list/index.js"; -export * from "./literals/index.js"; -export * from "./object/index.js"; -export * from "./object-like/index.js"; -export * from "./primitives/index.js"; -export * from "./record/index.js"; -export * from "./schema-utils/index.js"; -export * from "./set/index.js"; -export * from "./undiscriminated-union/index.js"; -export * from "./union/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts deleted file mode 100644 index e8ca40992061..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { SchemaGetter } from "./lazy.js"; -export { lazy } from "./lazy.js"; -export { lazyObject } from "./lazyObject.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts deleted file mode 100644 index 37f28871683a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { BaseSchema, Schema } from "../../Schema.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export type SchemaGetter> = () => SchemaType; - -export function lazy(getter: SchemaGetter>): Schema { - const baseSchema = constructLazyBaseSchema(getter); - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function constructLazyBaseSchema( - getter: SchemaGetter>, -): BaseSchema { - return { - parse: (raw, opts) => getMemoizedSchema(getter).parse(raw, opts), - json: (parsed, opts) => getMemoizedSchema(getter).json(parsed, opts), - getType: () => getMemoizedSchema(getter).getType(), - }; -} - -type MemoizedGetter> = SchemaGetter & { __zurg_memoized?: SchemaType }; - -export function getMemoizedSchema>(getter: SchemaGetter): SchemaType { - const castedGetter = getter as MemoizedGetter; - if (castedGetter.__zurg_memoized == null) { - castedGetter.__zurg_memoized = getter(); - } - return castedGetter.__zurg_memoized; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts deleted file mode 100644 index 192c90e5c83e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { getObjectUtils } from "../object/index.js"; -import type { BaseObjectSchema, ObjectSchema } from "../object/types.js"; -import { getObjectLikeUtils } from "../object-like/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import { constructLazyBaseSchema, getMemoizedSchema, type SchemaGetter } from "./lazy.js"; - -export function lazyObject(getter: SchemaGetter>): ObjectSchema { - const baseSchema: BaseObjectSchema = { - ...constructLazyBaseSchema(getter), - _getRawProperties: () => getMemoizedSchema(getter)._getRawProperties(), - _getParsedProperties: () => getMemoizedSchema(getter)._getParsedProperties(), - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts deleted file mode 100644 index 021f1e4df1ff..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { list } from "./list.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts deleted file mode 100644 index 4f8c10ba483a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { type BaseSchema, type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export function list(schema: Schema): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => - validateAndTransformArray(raw, (item, index) => - schema.parse(item, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], - }), - ), - json: (parsed, opts) => - validateAndTransformArray(parsed, (item, index) => - schema.json(item, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], - }), - ), - getType: () => SchemaType.LIST, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} - -function validateAndTransformArray( - value: unknown, - transformItem: (item: Raw, index: number) => MaybeValid, -): MaybeValid { - if (!Array.isArray(value)) { - return { - ok: false, - errors: [ - { - message: getErrorMessageForIncorrectType(value, "list"), - path: [], - }, - ], - }; - } - - const maybeValidItems = value.map((item, index) => transformItem(item, index)); - - return maybeValidItems.reduce>( - (acc, item) => { - if (acc.ok && item.ok) { - return { - ok: true, - value: [...acc.value, item.value], - }; - } - - const errors: ValidationError[] = []; - if (!acc.ok) { - errors.push(...acc.errors); - } - if (!item.ok) { - errors.push(...item.errors); - } - - return { - ok: false, - errors, - }; - }, - { ok: true, value: [] }, - ); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts deleted file mode 100644 index db5d2c7a7313..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export function booleanLiteral(literal: V): Schema { - const schemaCreator = createIdentitySchemaCreator( - SchemaType.BOOLEAN_LITERAL, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (value === literal) { - return { - ok: true, - value: literal, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, `${literal.toString()}`), - }, - ], - }; - } - }, - ); - - return schemaCreator(); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts deleted file mode 100644 index 4a4ab39d91a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { booleanLiteral } from "./booleanLiteral.js"; -export { stringLiteral } from "./stringLiteral.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts deleted file mode 100644 index ce6e20caf8d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export function stringLiteral(literal: V): Schema { - const schemaCreator = createIdentitySchemaCreator( - SchemaType.STRING_LITERAL, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (value === literal) { - return { - ok: true, - value: literal, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, `"${literal}"`), - }, - ], - }; - } - }, - ); - - return schemaCreator(); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts deleted file mode 100644 index af69acb01dc1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { BaseSchema } from "../../Schema.js"; -import { filterObject } from "../../utils/filterObject.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; - -export function getObjectLikeUtils(schema: BaseSchema): ObjectLikeUtils { - return { - withParsedProperties: (properties) => withParsedProperties(schema, properties), - }; -} - -/** - * object-like utils are defined in one file to resolve issues with circular imports - */ - -export function withParsedProperties( - objectLike: BaseSchema, - properties: { [K in keyof Properties]: Properties[K] | ((parsed: ParsedObjectShape) => Properties[K]) }, -): ObjectLikeSchema { - const objectSchema: BaseSchema = { - parse: (raw, opts) => { - const parsedObject = objectLike.parse(raw, opts); - if (!parsedObject.ok) { - return parsedObject; - } - - const additionalProperties = Object.entries(properties).reduce>( - (processed, [key, value]) => { - return { - ...processed, - [key]: typeof value === "function" ? value(parsedObject.value) : value, - }; - }, - {}, - ); - - return { - ok: true, - value: { - ...parsedObject.value, - ...(additionalProperties as Properties), - }, - }; - }, - - json: (parsed, opts) => { - if (!isPlainObject(parsed)) { - return { - ok: false, - errors: [ - { - path: opts?.breadcrumbsPrefix ?? [], - message: getErrorMessageForIncorrectType(parsed, "object"), - }, - ], - }; - } - - // strip out added properties - const addedPropertyKeys = new Set(Object.keys(properties)); - const parsedWithoutAddedProperties = filterObject( - parsed, - Object.keys(parsed).filter((key) => !addedPropertyKeys.has(key)), - ); - - return objectLike.json(parsedWithoutAddedProperties as ParsedObjectShape, opts); - }, - - getType: () => objectLike.getType(), - }; - - return { - ...objectSchema, - ...getSchemaUtils(objectSchema), - ...getObjectLikeUtils(objectSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts deleted file mode 100644 index 2451ef7d0e50..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { getObjectLikeUtils, withParsedProperties } from "./getObjectLikeUtils.js"; -export type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts deleted file mode 100644 index 44b9669108cb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { BaseSchema, Schema } from "../../Schema.js"; - -export type ObjectLikeSchema = Schema & - BaseSchema & - ObjectLikeUtils; - -export interface ObjectLikeUtils { - withParsedProperties: >( - properties: { - [K in keyof T]: T[K] | ((parsed: Parsed) => T[K]); - }, - ) => ObjectLikeSchema; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts deleted file mode 100644 index c6611aaacd3b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -export { getObjectUtils, object } from "./object.js"; -export type { - inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas, - inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas, -} from "./objectWithoutOptionalProperties.js"; -export { objectWithoutOptionalProperties } from "./objectWithoutOptionalProperties.js"; -export type { Property } from "./property.js"; -export { isProperty, property } from "./property.js"; -export type { - BaseObjectSchema, - inferObjectSchemaFromPropertySchemas, - inferParsedObject, - inferParsedObjectFromPropertySchemas, - inferParsedPropertySchema, - inferRawKey, - inferRawObject, - inferRawObjectFromPropertySchemas, - inferRawPropertySchema, - ObjectSchema, - ObjectUtils, - PropertySchemas, -} from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts deleted file mode 100644 index 624d4d3888d5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts +++ /dev/null @@ -1,382 +0,0 @@ -import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; -import { entries } from "../../utils/entries.js"; -import { filterObject } from "../../utils/filterObject.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { keys } from "../../utils/keys.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { partition } from "../../utils/partition.js"; -import { getObjectLikeUtils } from "../object-like/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import { isProperty } from "./property.js"; -import type { - BaseObjectSchema, - inferObjectSchemaFromPropertySchemas, - inferParsedObjectFromPropertySchemas, - inferRawObjectFromPropertySchemas, - ObjectSchema, - ObjectUtils, - PropertySchemas, -} from "./types.js"; - -interface ObjectPropertyWithRawKey { - rawKey: string; - parsedKey: string; - valueSchema: Schema; -} - -export function object>( - schemas: T, -): inferObjectSchemaFromPropertySchemas { - const baseSchema: BaseObjectSchema< - inferRawObjectFromPropertySchemas, - inferParsedObjectFromPropertySchemas - > = { - _getRawProperties: () => - Object.entries(schemas).map(([parsedKey, propertySchema]) => - isProperty(propertySchema) ? propertySchema.rawKey : parsedKey, - ) as unknown as (keyof inferRawObjectFromPropertySchemas)[], - _getParsedProperties: () => keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[], - - parse: (raw, opts) => { - const rawKeyToProperty: Record = {}; - const requiredKeys: string[] = []; - - for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { - const rawKey = isProperty(schemaOrObjectProperty) ? schemaOrObjectProperty.rawKey : parsedKey; - const valueSchema: Schema = isProperty(schemaOrObjectProperty) - ? schemaOrObjectProperty.valueSchema - : schemaOrObjectProperty; - - const property: ObjectPropertyWithRawKey = { - rawKey, - parsedKey: parsedKey as string, - valueSchema, - }; - - rawKeyToProperty[rawKey] = property; - - if (isSchemaRequired(valueSchema)) { - requiredKeys.push(rawKey); - } - } - - return validateAndTransformObject({ - value: raw, - requiredKeys, - getProperty: (rawKey) => { - const property = rawKeyToProperty[rawKey]; - if (property == null) { - return undefined; - } - return { - transformedKey: property.parsedKey, - transform: (propertyValue) => - property.valueSchema.parse(propertyValue, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawKey], - }), - }; - }, - unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, - skipValidation: opts?.skipValidation, - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - omitUndefined: opts?.omitUndefined, - }); - }, - - json: (parsed, opts) => { - const requiredKeys: string[] = []; - - for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { - const valueSchema: Schema = isProperty(schemaOrObjectProperty) - ? schemaOrObjectProperty.valueSchema - : schemaOrObjectProperty; - - if (isSchemaRequired(valueSchema)) { - requiredKeys.push(parsedKey as string); - } - } - - return validateAndTransformObject({ - value: parsed, - requiredKeys, - getProperty: ( - parsedKey, - ): { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined => { - const property = schemas[parsedKey as keyof T]; - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (property == null) { - return undefined; - } - - if (isProperty(property)) { - return { - transformedKey: property.rawKey, - transform: (propertyValue) => - property.valueSchema.json(propertyValue, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], - }), - }; - } else { - return { - transformedKey: parsedKey, - transform: (propertyValue) => - property.json(propertyValue, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], - }), - }; - } - }, - unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, - skipValidation: opts?.skipValidation, - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - omitUndefined: opts?.omitUndefined, - }); - }, - - getType: () => SchemaType.OBJECT, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; -} - -function validateAndTransformObject({ - value, - requiredKeys, - getProperty, - unrecognizedObjectKeys = "fail", - skipValidation = false, - breadcrumbsPrefix = [], -}: { - value: unknown; - requiredKeys: string[]; - getProperty: ( - preTransformedKey: string, - ) => { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined; - unrecognizedObjectKeys: "fail" | "passthrough" | "strip" | undefined; - skipValidation: boolean | undefined; - breadcrumbsPrefix: string[] | undefined; - omitUndefined: boolean | undefined; -}): MaybeValid { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - const missingRequiredKeys = new Set(requiredKeys); - const errors: ValidationError[] = []; - const transformed: Record = {}; - - for (const [preTransformedKey, preTransformedItemValue] of Object.entries(value)) { - const property = getProperty(preTransformedKey); - - if (property != null) { - missingRequiredKeys.delete(preTransformedKey); - - const value = property.transform(preTransformedItemValue as object); - if (value.ok) { - transformed[property.transformedKey] = value.value; - } else { - transformed[preTransformedKey] = preTransformedItemValue; - errors.push(...value.errors); - } - } else { - switch (unrecognizedObjectKeys) { - case "fail": - errors.push({ - path: [...breadcrumbsPrefix, preTransformedKey], - message: `Unexpected key "${preTransformedKey}"`, - }); - break; - case "strip": - break; - case "passthrough": - transformed[preTransformedKey] = preTransformedItemValue; - break; - } - } - } - - errors.push( - ...requiredKeys - .filter((key) => missingRequiredKeys.has(key)) - .map((key) => ({ - path: breadcrumbsPrefix, - message: `Missing required key "${key}"`, - })), - ); - - if (errors.length === 0 || skipValidation) { - return { - ok: true, - value: transformed as Transformed, - }; - } else { - return { - ok: false, - errors, - }; - } -} - -export function getObjectUtils(schema: BaseObjectSchema): ObjectUtils { - return { - extend: (extension: ObjectSchema) => { - const baseSchema: BaseObjectSchema = { - _getParsedProperties: () => [...schema._getParsedProperties(), ...extension._getParsedProperties()], - _getRawProperties: () => [...schema._getRawProperties(), ...extension._getRawProperties()], - parse: (raw, opts) => { - return validateAndTransformExtendedObject({ - extensionKeys: extension._getRawProperties(), - value: raw, - transformBase: (rawBase) => schema.parse(rawBase, opts), - transformExtension: (rawExtension) => extension.parse(rawExtension, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - json: (parsed, opts) => { - return validateAndTransformExtendedObject({ - extensionKeys: extension._getParsedProperties(), - value: parsed, - transformBase: (parsedBase) => schema.json(parsedBase, opts), - transformExtension: (parsedExtension) => extension.json(parsedExtension, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - getType: () => SchemaType.OBJECT, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; - }, - passthrough: () => { - const baseSchema: BaseObjectSchema = - { - _getParsedProperties: () => schema._getParsedProperties(), - _getRawProperties: () => schema._getRawProperties(), - parse: (raw, opts) => { - const transformed = schema.parse(raw, { ...opts, unrecognizedObjectKeys: "passthrough" }); - if (!transformed.ok) { - return transformed; - } - return { - ok: true, - value: { - ...(raw as any), - ...transformed.value, - }, - }; - }, - json: (parsed, opts) => { - const transformed = schema.json(parsed, { ...opts, unrecognizedObjectKeys: "passthrough" }); - if (!transformed.ok) { - return transformed; - } - return { - ok: true, - value: { - ...(parsed as any), - ...transformed.value, - }, - }; - }, - getType: () => SchemaType.OBJECT, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; - }, - }; -} - -function validateAndTransformExtendedObject({ - extensionKeys, - value, - transformBase, - transformExtension, - breadcrumbsPrefix = [], -}: { - extensionKeys: (keyof PreTransformedExtension)[]; - value: unknown; - transformBase: (value: object) => MaybeValid; - transformExtension: (value: object) => MaybeValid; - breadcrumbsPrefix?: string[]; -}): MaybeValid { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - const extensionPropertiesSet = new Set(extensionKeys); - const [extensionProperties, baseProperties] = partition(keys(value), (key) => - extensionPropertiesSet.has(key as keyof PreTransformedExtension), - ); - - const transformedBase = transformBase(filterObject(value, baseProperties)); - const transformedExtension = transformExtension(filterObject(value, extensionProperties)); - - if (transformedBase.ok && transformedExtension.ok) { - return { - ok: true, - value: { - ...transformedBase.value, - ...transformedExtension.value, - }, - }; - } else { - return { - ok: false, - errors: [ - ...(transformedBase.ok ? [] : transformedBase.errors), - ...(transformedExtension.ok ? [] : transformedExtension.errors), - ], - }; - } -} - -function isSchemaRequired(schema: Schema): boolean { - return !isSchemaOptional(schema); -} - -function isSchemaOptional(schema: Schema): boolean { - switch (schema.getType()) { - case SchemaType.ANY: - case SchemaType.UNKNOWN: - case SchemaType.OPTIONAL: - case SchemaType.OPTIONAL_NULLABLE: - return true; - default: - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts deleted file mode 100644 index 4d39c862f0c4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { object } from "./object.js"; -import type { - inferParsedPropertySchema, - inferRawObjectFromPropertySchemas, - ObjectSchema, - PropertySchemas, -} from "./types.js"; - -export function objectWithoutOptionalProperties>( - schemas: T, -): inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas { - return object(schemas) as unknown as inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas; -} - -export type inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas> = - ObjectSchema< - inferRawObjectFromPropertySchemas, - inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas - >; - -export type inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas> = { - [K in keyof T]: inferParsedPropertySchema; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts deleted file mode 100644 index d1f9f386aa64..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Schema } from "../../Schema.js"; - -export function property( - rawKey: RawKey, - valueSchema: Schema, -): Property { - return { - rawKey, - valueSchema, - isProperty: true, - }; -} - -export interface Property { - rawKey: RawKey; - valueSchema: Schema; - isProperty: true; -} - -export function isProperty>(maybeProperty: unknown): maybeProperty is O { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return (maybeProperty as O).isProperty; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts deleted file mode 100644 index 735d14fc4cee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts +++ /dev/null @@ -1,73 +0,0 @@ -import type { BaseSchema, inferParsed, inferRaw, Schema } from "../../Schema.js"; -import type { addQuestionMarksToNullableProperties } from "../../utils/addQuestionMarksToNullableProperties.js"; -import type { ObjectLikeUtils } from "../object-like/index.js"; -import type { SchemaUtils } from "../schema-utils/index.js"; -import type { Property } from "./property.js"; - -export type ObjectSchema = BaseObjectSchema & - ObjectLikeUtils & - ObjectUtils & - SchemaUtils; - -export interface BaseObjectSchema extends BaseSchema { - _getRawProperties: () => (keyof Raw)[]; - _getParsedProperties: () => (keyof Parsed)[]; -} - -export interface ObjectUtils { - extend: ( - schemas: ObjectSchema, - ) => ObjectSchema; - passthrough: () => ObjectSchema; -} - -export type inferRawObject> = O extends ObjectSchema ? Raw : never; - -export type inferParsedObject> = O extends ObjectSchema - ? Parsed - : never; - -export type inferObjectSchemaFromPropertySchemas> = ObjectSchema< - inferRawObjectFromPropertySchemas, - inferParsedObjectFromPropertySchemas ->; - -export type inferRawObjectFromPropertySchemas> = - addQuestionMarksToNullableProperties<{ - [ParsedKey in keyof T as inferRawKey]: inferRawPropertySchema; - }>; - -export type inferParsedObjectFromPropertySchemas> = - addQuestionMarksToNullableProperties<{ - [K in keyof T]: inferParsedPropertySchema; - }>; - -export type PropertySchemas = Record< - ParsedKeys, - Property | Schema ->; - -export type inferRawPropertySchema

| Schema> = P extends Property< - any, - infer Raw, - any -> - ? Raw - : P extends Schema - ? inferRaw

- : never; - -export type inferParsedPropertySchema

| Schema> = P extends Property< - any, - any, - infer Parsed -> - ? Parsed - : P extends Schema - ? inferParsed

- : never; - -export type inferRawKey< - ParsedKey extends string | number | symbol, - P extends Property | Schema, -> = P extends Property ? Raw : ParsedKey; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts deleted file mode 100644 index bc4d47fab56e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; - -export const any: () => Schema = createIdentitySchemaCreator(SchemaType.ANY, (value) => ({ - ok: true, - value, -})); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts deleted file mode 100644 index 78c3c36284c7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export const boolean: () => Schema = createIdentitySchemaCreator( - SchemaType.BOOLEAN, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (typeof value === "boolean") { - return { - ok: true, - value, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "boolean"), - }, - ], - }; - } - }, -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts deleted file mode 100644 index 7a3ee0154829..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { any } from "./any.js"; -export { boolean } from "./boolean.js"; -export { never } from "./never.js"; -export { number } from "./number.js"; -export { string } from "./string.js"; -export { unknown } from "./unknown.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts deleted file mode 100644 index 91f85d74c01b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; - -export const never: () => Schema = createIdentitySchemaCreator( - SchemaType.NEVER, - (_value, { breadcrumbsPrefix = [] } = {}) => ({ - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: "Expected never", - }, - ], - }), -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts deleted file mode 100644 index 6f16cd462a1b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export const number: () => Schema = createIdentitySchemaCreator( - SchemaType.NUMBER, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (typeof value === "number") { - return { - ok: true, - value, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "number"), - }, - ], - }; - } - }, -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts deleted file mode 100644 index b29d72ae7ef1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export const string: () => Schema = createIdentitySchemaCreator( - SchemaType.STRING, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (typeof value === "string") { - return { - ok: true, - value, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "string"), - }, - ], - }; - } - }, -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts deleted file mode 100644 index 04514160366f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; - -export const unknown: () => Schema = createIdentitySchemaCreator( - SchemaType.UNKNOWN, - (value) => ({ ok: true, value }), -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts deleted file mode 100644 index b17997f7bf84..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { record } from "./record.js"; -export type { BaseRecordSchema, RecordSchema } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts deleted file mode 100644 index a489660399b7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; -import { entries } from "../../utils/entries.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { BaseRecordSchema, RecordSchema } from "./types.js"; - -export function record( - keySchema: Schema, - valueSchema: Schema, -): RecordSchema { - const baseSchema: BaseRecordSchema = { - parse: (raw, opts) => { - return validateAndTransformRecord({ - value: raw, - isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, - transformKey: (key) => - keySchema.parse(key, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], - }), - transformValue: (value, key) => - valueSchema.parse(value, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], - }), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - json: (parsed, opts) => { - return validateAndTransformRecord({ - value: parsed, - isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, - transformKey: (key) => - keySchema.json(key, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], - }), - transformValue: (value, key) => - valueSchema.json(value, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], - }), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - getType: () => SchemaType.RECORD, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} - -function validateAndTransformRecord({ - value, - isKeyNumeric, - transformKey, - transformValue, - breadcrumbsPrefix = [], -}: { - value: unknown; - isKeyNumeric: boolean; - transformKey: (key: string | number) => MaybeValid; - transformValue: (value: unknown, key: string | number) => MaybeValid; - breadcrumbsPrefix: string[] | undefined; -}): MaybeValid> { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - return entries(value).reduce>>( - (accPromise, [stringKey, value]) => { - if (value === undefined) { - return accPromise; - } - - const acc = accPromise; - - let key: string | number = stringKey; - if (isKeyNumeric) { - const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; - if (!Number.isNaN(numberKey)) { - key = numberKey; - } - } - const transformedKey = transformKey(key); - - const transformedValue = transformValue(value, key); - - if (acc.ok && transformedKey.ok && transformedValue.ok) { - return { - ok: true, - value: { - ...acc.value, - [transformedKey.value]: transformedValue.value, - }, - }; - } - - const errors: ValidationError[] = []; - if (!acc.ok) { - errors.push(...acc.errors); - } - if (!transformedKey.ok) { - errors.push(...transformedKey.errors); - } - if (!transformedValue.ok) { - errors.push(...transformedValue.errors); - } - - return { - ok: false, - errors, - }; - }, - { ok: true, value: {} as Record }, - ); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts deleted file mode 100644 index 5950b4cbde1e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { BaseSchema } from "../../Schema.js"; -import type { SchemaUtils } from "../schema-utils/index.js"; - -export type RecordSchema< - RawKey extends string | number, - RawValue, - ParsedKey extends string | number, - ParsedValue, -> = BaseRecordSchema & - SchemaUtils, Record>; - -export type BaseRecordSchema< - RawKey extends string | number, - RawValue, - ParsedKey extends string | number, - ParsedValue, -> = BaseSchema, Record>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts deleted file mode 100644 index daee3dc79184..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ValidationError } from "../../Schema.js"; -import { stringifyValidationError } from "./stringifyValidationErrors.js"; - -export class JsonError extends Error { - constructor(public readonly errors: ValidationError[]) { - super(errors.map(stringifyValidationError).join("; ")); - Object.setPrototypeOf(this, JsonError.prototype); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts deleted file mode 100644 index 9facf06159b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ValidationError } from "../../Schema.js"; -import { stringifyValidationError } from "./stringifyValidationErrors.js"; - -export class ParseError extends Error { - constructor(public readonly errors: ValidationError[]) { - super(errors.map(stringifyValidationError).join("; ")); - Object.setPrototypeOf(this, ParseError.prototype); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts deleted file mode 100644 index 3ceaf4e011f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { type BaseSchema, type Schema, type SchemaOptions, SchemaType } from "../../Schema.js"; -import { JsonError } from "./JsonError.js"; -import { ParseError } from "./ParseError.js"; - -export interface SchemaUtils { - nullable: () => Schema; - optional: () => Schema; - optionalNullable: () => Schema; - transform: (transformer: SchemaTransformer) => Schema; - parseOrThrow: (raw: unknown, opts?: SchemaOptions) => Parsed; - jsonOrThrow: (raw: unknown, opts?: SchemaOptions) => Raw; -} - -export interface SchemaTransformer { - transform: (parsed: Parsed) => Transformed; - untransform: (transformed: any) => Parsed; -} - -export function getSchemaUtils(schema: BaseSchema): SchemaUtils { - return { - nullable: () => nullable(schema), - optional: () => optional(schema), - optionalNullable: () => optionalNullable(schema), - transform: (transformer) => transform(schema, transformer), - parseOrThrow: (raw, opts) => { - const parsed = schema.parse(raw, opts); - if (parsed.ok) { - return parsed.value; - } - throw new ParseError(parsed.errors); - }, - jsonOrThrow: (parsed, opts) => { - const raw = schema.json(parsed, opts); - if (raw.ok) { - return raw.value; - } - throw new JsonError(raw.errors); - }, - }; -} - -/** - * schema utils are defined in one file to resolve issues with circular imports - */ - -export function nullable(schema: BaseSchema): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - if (raw == null) { - return { - ok: true, - value: null, - }; - } - return schema.parse(raw, opts); - }, - json: (parsed, opts) => { - if (parsed == null) { - return { - ok: true, - value: null, - }; - } - return schema.json(parsed, opts); - }, - getType: () => SchemaType.NULLABLE, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function optional( - schema: BaseSchema, -): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - if (raw == null) { - return { - ok: true, - value: undefined, - }; - } - return schema.parse(raw, opts); - }, - json: (parsed, opts) => { - if (opts?.omitUndefined && parsed === undefined) { - return { - ok: true, - value: undefined, - }; - } - if (parsed == null) { - return { - ok: true, - value: null, - }; - } - return schema.json(parsed, opts); - }, - getType: () => SchemaType.OPTIONAL, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function optionalNullable( - schema: BaseSchema, -): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - if (raw === undefined) { - return { - ok: true, - value: undefined, - }; - } - if (raw === null) { - return { - ok: true, - value: null, - }; - } - return schema.parse(raw, opts); - }, - json: (parsed, opts) => { - if (parsed === undefined) { - return { - ok: true, - value: undefined, - }; - } - if (parsed === null) { - return { - ok: true, - value: null, - }; - } - return schema.json(parsed, opts); - }, - getType: () => SchemaType.OPTIONAL_NULLABLE, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function transform( - schema: BaseSchema, - transformer: SchemaTransformer, -): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - const parsed = schema.parse(raw, opts); - if (!parsed.ok) { - return parsed; - } - return { - ok: true, - value: transformer.transform(parsed.value), - }; - }, - json: (transformed, opts) => { - const parsed = transformer.untransform(transformed); - return schema.json(parsed, opts); - }, - getType: () => schema.getType(), - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts deleted file mode 100644 index efb3b0c46288..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type { SchemaUtils } from "./getSchemaUtils.js"; -export { getSchemaUtils, optional, transform } from "./getSchemaUtils.js"; -export { JsonError } from "./JsonError.js"; -export { ParseError } from "./ParseError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts deleted file mode 100644 index d36a4900c6e6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { ValidationError } from "../../Schema.js"; - -export function stringifyValidationError(error: ValidationError): string { - if (error.path.length === 0) { - return error.message; - } - return `${error.path.join(" -> ")}: ${error.message}`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts deleted file mode 100644 index c72be55e9406..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { set } from "./set.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts deleted file mode 100644 index 2013cdb4760f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { list } from "../list/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export function set(schema: Schema): Schema> { - const listSchema = list(schema); - const baseSchema: BaseSchema> = { - parse: (raw, opts) => { - const parsedList = listSchema.parse(raw, opts); - if (parsedList.ok) { - return { - ok: true, - value: new Set(parsedList.value), - }; - } else { - return parsedList; - } - }, - json: (parsed, opts) => { - if (!(parsed instanceof Set)) { - return { - ok: false, - errors: [ - { - path: opts?.breadcrumbsPrefix ?? [], - message: getErrorMessageForIncorrectType(parsed, "Set"), - }, - ], - }; - } - const jsonList = listSchema.json([...parsed], opts); - return jsonList; - }, - getType: () => SchemaType.SET, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts deleted file mode 100644 index c8318222b4f7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { - inferParsedUnidiscriminatedUnionSchema, - inferRawUnidiscriminatedUnionSchema, - UndiscriminatedUnionSchema, -} from "./types.js"; -export { undiscriminatedUnion } from "./undiscriminatedUnion.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts deleted file mode 100644 index 0d5096fab913..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { inferParsed, inferRaw, Schema } from "../../Schema.js"; - -export type UndiscriminatedUnionSchema = Schema< - inferRawUnidiscriminatedUnionSchema, - inferParsedUnidiscriminatedUnionSchema ->; - -export type inferRawUnidiscriminatedUnionSchema = inferRaw; - -export type inferParsedUnidiscriminatedUnionSchema = inferParsed; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts deleted file mode 100644 index 07591b4d3e63..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - type BaseSchema, - type MaybeValid, - type Schema, - type SchemaOptions, - SchemaType, - type ValidationError, -} from "../../Schema.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { inferParsedUnidiscriminatedUnionSchema, inferRawUnidiscriminatedUnionSchema } from "./types.js"; - -export function undiscriminatedUnion, ...Schema[]]>( - schemas: Schemas, -): Schema, inferParsedUnidiscriminatedUnionSchema> { - const baseSchema: BaseSchema< - inferRawUnidiscriminatedUnionSchema, - inferParsedUnidiscriminatedUnionSchema - > = { - parse: (raw, opts) => { - return validateAndTransformUndiscriminatedUnion>( - (schema, opts) => schema.parse(raw, opts), - schemas, - opts, - ); - }, - json: (parsed, opts) => { - return validateAndTransformUndiscriminatedUnion>( - (schema, opts) => schema.json(parsed, opts), - schemas, - opts, - ); - }, - getType: () => SchemaType.UNDISCRIMINATED_UNION, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} - -function validateAndTransformUndiscriminatedUnion( - transform: (schema: Schema, opts: SchemaOptions) => MaybeValid, - schemas: Schema[], - opts: SchemaOptions | undefined, -): MaybeValid { - const errors: ValidationError[] = []; - for (const [index, schema] of schemas.entries()) { - const transformed = transform(schema, { ...opts, skipValidation: false }); - if (transformed.ok) { - return transformed; - } else { - for (const error of transformed.errors) { - errors.push({ - path: error.path, - message: `[Variant ${index}] ${error.message}`, - }); - } - } - } - - return { - ok: false, - errors, - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts deleted file mode 100644 index 73cd62adeba5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts +++ /dev/null @@ -1,14 +0,0 @@ -export function discriminant( - parsedDiscriminant: ParsedDiscriminant, - rawDiscriminant: RawDiscriminant, -): Discriminant { - return { - parsedDiscriminant, - rawDiscriminant, - }; -} - -export interface Discriminant { - parsedDiscriminant: ParsedDiscriminant; - rawDiscriminant: RawDiscriminant; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts deleted file mode 100644 index 6bc29ba9ed38..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type { Discriminant } from "./discriminant.js"; -export { discriminant } from "./discriminant.js"; -export type { - inferParsedDiscriminant, - inferParsedUnion, - inferRawDiscriminant, - inferRawUnion, - UnionSubtypes, -} from "./types.js"; -export { union } from "./union.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts deleted file mode 100644 index 7bfdd636d8d0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { inferParsedObject, inferRawObject, ObjectSchema } from "../object/index.js"; -import type { Discriminant } from "./discriminant.js"; - -export type UnionSubtypes = { - [K in DiscriminantValues]: ObjectSchema; -}; - -export type inferRawUnion, U extends UnionSubtypes> = { - [K in keyof U]: Record, K> & inferRawObject; -}[keyof U]; - -export type inferParsedUnion, U extends UnionSubtypes> = { - [K in keyof U]: Record, K> & inferParsedObject; -}[keyof U]; - -export type inferRawDiscriminant> = D extends string - ? D - : D extends Discriminant - ? Raw - : never; - -export type inferParsedDiscriminant> = D extends string - ? D - : D extends Discriminant - ? Parsed - : never; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts deleted file mode 100644 index 509658e0eb3d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { type BaseSchema, type MaybeValid, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { keys } from "../../utils/keys.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { enum_ } from "../enum/index.js"; -import type { ObjectSchema } from "../object/index.js"; -import { getObjectLikeUtils, type ObjectLikeSchema } from "../object-like/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { Discriminant } from "./discriminant.js"; -import type { - inferParsedDiscriminant, - inferParsedUnion, - inferRawDiscriminant, - inferRawUnion, - UnionSubtypes, -} from "./types.js"; - -export function union, U extends UnionSubtypes>( - discriminant: D, - union: U, -): ObjectLikeSchema, inferParsedUnion> { - const rawDiscriminant = - typeof discriminant === "string" ? discriminant : (discriminant.rawDiscriminant as inferRawDiscriminant); - const parsedDiscriminant = - typeof discriminant === "string" - ? discriminant - : (discriminant.parsedDiscriminant as inferParsedDiscriminant); - - const discriminantValueSchema = enum_(keys(union) as string[]); - - const baseSchema: BaseSchema, inferParsedUnion> = { - parse: (raw, opts) => { - return transformAndValidateUnion({ - value: raw, - discriminant: rawDiscriminant, - transformedDiscriminant: parsedDiscriminant, - transformDiscriminantValue: (discriminantValue) => - discriminantValueSchema.parse(discriminantValue, { - allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawDiscriminant], - }), - getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], - allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, - transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => - additionalPropertiesSchema.parse(additionalProperties, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - json: (parsed, opts) => { - return transformAndValidateUnion({ - value: parsed, - discriminant: parsedDiscriminant, - transformedDiscriminant: rawDiscriminant, - transformDiscriminantValue: (discriminantValue) => - discriminantValueSchema.json(discriminantValue, { - allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedDiscriminant], - }), - getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], - allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, - transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => - additionalPropertiesSchema.json(additionalProperties, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - getType: () => SchemaType.UNION, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - }; -} - -function transformAndValidateUnion< - TransformedDiscriminant extends string, - TransformedDiscriminantValue extends string, - TransformedAdditionalProperties, ->({ - value, - discriminant, - transformedDiscriminant, - transformDiscriminantValue, - getAdditionalPropertiesSchema, - allowUnrecognizedUnionMembers = false, - transformAdditionalProperties, - breadcrumbsPrefix = [], -}: { - value: unknown; - discriminant: string; - transformedDiscriminant: TransformedDiscriminant; - transformDiscriminantValue: (discriminantValue: unknown) => MaybeValid; - getAdditionalPropertiesSchema: (discriminantValue: string) => ObjectSchema | undefined; - allowUnrecognizedUnionMembers: boolean | undefined; - transformAdditionalProperties: ( - additionalProperties: unknown, - additionalPropertiesSchema: ObjectSchema, - ) => MaybeValid; - breadcrumbsPrefix: string[] | undefined; -}): MaybeValid & TransformedAdditionalProperties> { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - const { [discriminant]: discriminantValue, ...additionalProperties } = value; - - if (discriminantValue == null) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: `Missing discriminant ("${discriminant}")`, - }, - ], - }; - } - - const transformedDiscriminantValue = transformDiscriminantValue(discriminantValue); - if (!transformedDiscriminantValue.ok) { - return { - ok: false, - errors: transformedDiscriminantValue.errors, - }; - } - - const additionalPropertiesSchema = getAdditionalPropertiesSchema(transformedDiscriminantValue.value); - - if (additionalPropertiesSchema == null) { - if (allowUnrecognizedUnionMembers) { - return { - ok: true, - value: { - [transformedDiscriminant]: transformedDiscriminantValue.value, - ...additionalProperties, - } as Record & TransformedAdditionalProperties, - }; - } else { - return { - ok: false, - errors: [ - { - path: [...breadcrumbsPrefix, discriminant], - message: "Unexpected discriminant value", - }, - ], - }; - } - } - - const transformedAdditionalProperties = transformAdditionalProperties( - additionalProperties, - additionalPropertiesSchema, - ); - if (!transformedAdditionalProperties.ok) { - return transformedAdditionalProperties; - } - - return { - ok: true, - value: { - [transformedDiscriminant]: discriminantValue, - ...transformedAdditionalProperties.value, - } as Record & TransformedAdditionalProperties, - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts deleted file mode 100644 index befac2e3bebc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./builders/index.js"; -export type { inferParsed, inferRaw, Schema, SchemaOptions } from "./Schema.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts deleted file mode 100644 index 9cd354b3418e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts +++ /dev/null @@ -1 +0,0 @@ -export type MaybePromise = T | Promise; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts deleted file mode 100644 index 59f9e658867b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type addQuestionMarksToNullableProperties = { - [K in OptionalKeys]?: T[K]; -} & Pick>; - -export type OptionalKeys = { - [K in keyof T]-?: undefined extends T[K] ? K : never; -}[keyof T]; - -export type RequiredKeys = Exclude>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts deleted file mode 100644 index 9aa4ed5029a0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { getSchemaUtils } from "../builders/schema-utils/index.js"; -import type { BaseSchema, MaybeValid, Schema, SchemaOptions, SchemaType } from "../Schema.js"; -import { maybeSkipValidation } from "./maybeSkipValidation.js"; - -export function createIdentitySchemaCreator( - schemaType: SchemaType, - validate: (value: unknown, opts?: SchemaOptions) => MaybeValid, -): () => Schema { - return () => { - const baseSchema: BaseSchema = { - parse: validate, - json: validate, - getType: () => schemaType, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts deleted file mode 100644 index 2d5c93d657ce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function entries(object: T): [keyof T, T[keyof T]][] { - return Object.entries(object) as [keyof T, T[keyof T]][]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts deleted file mode 100644 index 70527d10013b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts +++ /dev/null @@ -1,13 +0,0 @@ -export function filterObject(obj: T, keysToInclude: K[]): Pick { - const keysToIncludeSet = new Set(keysToInclude); - return Object.entries(obj).reduce( - (acc, [key, value]) => { - if (keysToIncludeSet.has(key as K)) { - acc[key as K] = value as T[K]; - } - return acc; - // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter - }, - {} as Pick, - ); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts deleted file mode 100644 index 1a5c31027ce9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts +++ /dev/null @@ -1,25 +0,0 @@ -export function getErrorMessageForIncorrectType(value: unknown, expectedType: string): string { - return `Expected ${expectedType}. Received ${getTypeAsString(value)}.`; -} - -function getTypeAsString(value: unknown): string { - if (Array.isArray(value)) { - return "list"; - } - if (value === null) { - return "null"; - } - if (value instanceof BigInt) { - return "BigInt"; - } - switch (typeof value) { - case "string": - return `"${value}"`; - case "bigint": - case "number": - case "boolean": - case "undefined": - return `${value}`; - } - return typeof value; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts deleted file mode 100644 index db82a722c35b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts +++ /dev/null @@ -1,17 +0,0 @@ -// borrowed from https://github.com/lodash/lodash/blob/master/isPlainObject.js -export function isPlainObject(value: unknown): value is Record { - if (typeof value !== "object" || value === null) { - return false; - } - - if (Object.getPrototypeOf(value) === null) { - return true; - } - - let proto = value; - while (Object.getPrototypeOf(proto) !== null) { - proto = Object.getPrototypeOf(proto); - } - - return Object.getPrototypeOf(value) === proto; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts deleted file mode 100644 index 2e0930e2d70b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function keys(object: T): (keyof T)[] { - return Object.keys(object) as (keyof T)[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts deleted file mode 100644 index f32d4525136d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { BaseSchema, MaybeValid, SchemaOptions } from "../Schema.js"; - -export function maybeSkipValidation, Raw, Parsed>(schema: S): S { - return { - ...schema, - json: transformAndMaybeSkipValidation(schema.json), - parse: transformAndMaybeSkipValidation(schema.parse), - }; -} - -function transformAndMaybeSkipValidation( - transform: (value: unknown, opts?: SchemaOptions) => MaybeValid, -): (value: unknown, opts?: SchemaOptions) => MaybeValid { - return (value, opts): MaybeValid => { - const transformed = transform(value, opts); - const { skipValidation = false } = opts ?? {}; - if (!transformed.ok && skipValidation) { - // biome-ignore lint/suspicious/noConsole: allow console - console.warn( - [ - "Failed to validate.", - ...transformed.errors.map( - (error) => - " - " + - (error.path.length > 0 ? `${error.path.join(".")}: ${error.message}` : error.message), - ), - ].join("\n"), - ); - - return { - ok: true, - value: value as T, - }; - } else { - return transformed; - } - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts deleted file mode 100644 index f58d6f3d35f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts +++ /dev/null @@ -1,12 +0,0 @@ -export function partition(items: readonly T[], predicate: (item: T) => boolean): [T[], T[]] { - const trueItems: T[] = [], - falseItems: T[] = []; - for (const item of items) { - if (predicate(item)) { - trueItems.push(item); - } else { - falseItems.push(item); - } - } - return [trueItems, falseItems]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts deleted file mode 100644 index 19b901244218..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function encodePathParam(param: unknown): string { - if (param === null) { - return "null"; - } - const typeofParam = typeof param; - switch (typeofParam) { - case "undefined": - return "undefined"; - case "string": - case "number": - case "boolean": - break; - default: - param = String(param); - break; - } - return encodeURIComponent(param as string | number | boolean); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts deleted file mode 100644 index f2e0fa2d2221..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { encodePathParam } from "./encodePathParam.js"; -export { join } from "./join.js"; -export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts deleted file mode 100644 index 7ca7daef094d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts +++ /dev/null @@ -1,79 +0,0 @@ -export function join(base: string, ...segments: string[]): string { - if (!base) { - return ""; - } - - if (segments.length === 0) { - return base; - } - - if (base.includes("://")) { - let url: URL; - try { - url = new URL(base); - } catch { - return joinPath(base, ...segments); - } - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - url.pathname = joinPathSegments(url.pathname, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { - url.pathname += "/"; - } - - return url.toString(); - } - - return joinPath(base, ...segments); -} - -function joinPath(base: string, ...segments: string[]): string { - if (segments.length === 0) { - return base; - } - - let result = base; - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - result = joinPathSegments(result, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !result.endsWith("/")) { - result += "/"; - } - - return result; -} - -function joinPathSegments(left: string, right: string): string { - if (left.endsWith("/")) { - return left + right; - } - return `${left}/${right}`; -} - -function trimSlashes(str: string): string { - if (!str) return str; - - let start = 0; - let end = str.length; - - if (str.startsWith("/")) start = 1; - if (str.endsWith("/")) end = str.length - 1; - - return start === 0 && end === str.length ? str : str.slice(start, end); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts deleted file mode 100644 index 13e89be9d9a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts +++ /dev/null @@ -1,74 +0,0 @@ -interface QueryStringOptions { - arrayFormat?: "indices" | "repeat"; - encode?: boolean; -} - -const defaultQsOptions: Required = { - arrayFormat: "indices", - encode: true, -} as const; - -function encodeValue(value: unknown, shouldEncode: boolean): string { - if (value === undefined) { - return ""; - } - if (value === null) { - return ""; - } - const stringValue = String(value); - return shouldEncode ? encodeURIComponent(stringValue) : stringValue; -} - -function stringifyObject(obj: Record, prefix = "", options: Required): string[] { - const parts: string[] = []; - - for (const [key, value] of Object.entries(obj)) { - const fullKey = prefix ? `${prefix}[${key}]` : key; - - if (value === undefined) { - continue; - } - - if (Array.isArray(value)) { - if (value.length === 0) { - continue; - } - for (let i = 0; i < value.length; i++) { - const item = value[i]; - if (item === undefined) { - continue; - } - if (typeof item === "object" && !Array.isArray(item) && item !== null) { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - parts.push(...stringifyObject(item as Record, arrayKey, options)); - } else { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; - parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); - } - } - } else if (typeof value === "object" && value !== null) { - if (Object.keys(value as Record).length === 0) { - continue; - } - parts.push(...stringifyObject(value as Record, fullKey, options)); - } else { - const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; - parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); - } - } - - return parts; -} - -export function toQueryString(obj: unknown, options?: QueryStringOptions): string { - if (obj == null || typeof obj !== "object") { - return ""; - } - - const parts = stringifyObject(obj as Record, "", { - ...defaultQsOptions, - ...options, - }); - return parts.join("&"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts deleted file mode 100644 index d2e515f5d4e2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import { toJson } from "../core/json.js"; - -export class SeedExhaustiveError extends Error { - public readonly statusCode?: number; - public readonly body?: unknown; - public readonly rawResponse?: core.RawResponse; - - constructor({ - message, - statusCode, - body, - rawResponse, - }: { - message?: string; - statusCode?: number; - body?: unknown; - rawResponse?: core.RawResponse; - }) { - super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - this.statusCode = statusCode; - this.body = body; - this.rawResponse = rawResponse; - } -} - -function buildMessage({ - message, - statusCode, - body, -}: { - message: string | undefined; - statusCode: number | undefined; - body: unknown | undefined; -}): string { - const lines: string[] = []; - if (message != null) { - lines.push(message); - } - - if (statusCode != null) { - lines.push(`Status code: ${statusCode.toString()}`); - } - - if (body != null) { - lines.push(`Body: ${toJson(body, undefined, 2)}`); - } - - return lines.join("\n"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts deleted file mode 100644 index 82a3cb8de266..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export class SeedExhaustiveTimeoutError extends Error { - constructor(message: string) { - super(message); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts deleted file mode 100644 index deb55c602654..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import * as errors from "./index.js"; - -export function handleNonStatusCodeError( - error: core.Fetcher.Error, - rawResponse: core.RawResponse, - method: string, - path: string, -): never { - switch (error.reason) { - case "non-json": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - body: error.rawBody, - rawResponse: rawResponse, - }); - case "body-is-null": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - rawResponse: rawResponse, - }); - case "timeout": - throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); - case "unknown": - throw new errors.SeedExhaustiveError({ - message: error.errorMessage, - rawResponse: rawResponse, - }); - default: - throw new errors.SeedExhaustiveError({ - message: "Unknown error", - rawResponse: rawResponse, - }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts deleted file mode 100644 index 2e2853073a94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; -export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts deleted file mode 100644 index 7b70ee14fc02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts deleted file mode 100644 index 9f0bdd34e0d5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * as SeedExhaustive from "./api/index.js"; -export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -export { SeedExhaustiveClient } from "./Client.js"; -export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; -export * from "./exports.js"; -export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts deleted file mode 100644 index 4866a9d8d770..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: serialization.Schema< - serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -export const Response: serialization.Schema< - serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts deleted file mode 100644 index adb39e17c39b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema< - serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, - string[] -> = serialization.list(serialization.string()); - -export declare namespace Request { - export type Raw = string[]; -} - -export const Response: serialization.Schema< - serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, - string[] -> = serialization.list(serialization.string()); - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts deleted file mode 100644 index 25acdb82fb28..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: serialization.Schema< - serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, - Record -> = serialization.record(serialization.string(), ObjectWithRequiredField); - -export declare namespace Request { - export type Raw = Record; -} - -export const Response: serialization.Schema< - serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, - Record -> = serialization.record(serialization.string(), ObjectWithRequiredField); - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts deleted file mode 100644 index 798054261d42..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema< - serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, - Record -> = serialization.record(serialization.string(), serialization.string()); - -export declare namespace Request { - export type Raw = Record; -} - -export const Response: serialization.Schema< - serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, - Record -> = serialization.record(serialization.string(), serialization.string()); - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts deleted file mode 100644 index aba0ab439f6d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: serialization.Schema< - serializers.endpoints.container.getAndReturnOptional.Request.Raw, - SeedExhaustive.types.ObjectWithRequiredField | undefined -> = ObjectWithRequiredField.optional(); - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} - -export const Response: serialization.Schema< - serializers.endpoints.container.getAndReturnOptional.Response.Raw, - SeedExhaustive.types.ObjectWithRequiredField | undefined -> = ObjectWithRequiredField.optional(); - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts deleted file mode 100644 index f8a7f9ea7545..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -export const Response: serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts deleted file mode 100644 index 5ad5cb13eddf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, - Set -> = serialization.set(serialization.string()); - -export declare namespace Request { - export type Raw = string[]; -} - -export const Response: serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, - Set -> = serialization.set(serialization.string()); - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index 1972f5b270f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; -export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; -export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; -export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; -export * as getAndReturnOptional from "./getAndReturnOptional.js"; -export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; -export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index e053119b972c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as testDelete from "./testDelete.js"; -export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts deleted file mode 100644 index 8322487928fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.boolean(); - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts deleted file mode 100644 index 56a70eed1b68..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts deleted file mode 100644 index cd7e640937da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as container from "./container/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts deleted file mode 100644 index a075c14e0cf7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; - -export const Request: serialization.Schema< - serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, - SeedExhaustive.types.NestedObjectWithRequiredField[] -> = serialization.list(NestedObjectWithRequiredField); - -export declare namespace Request { - export type Raw = NestedObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index d00c4c582910..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts deleted file mode 100644 index 9a2139917311..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts deleted file mode 100644 index b620a7ba796a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index b30603cae602..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as getWithInlinePath from "./getWithInlinePath.js"; -export * as getWithPath from "./getWithPath.js"; -export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; -export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts deleted file mode 100644 index 85205c392705..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts deleted file mode 100644 index c7784b75b36c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts deleted file mode 100644 index 0900f791e8c9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts deleted file mode 100644 index 6fb2f3a6385a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.boolean(); - -export declare namespace Request { - export type Raw = boolean; -} - -export const Response: serialization.Schema = - serialization.boolean(); - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts deleted file mode 100644 index c1ba4ac07088..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts deleted file mode 100644 index a0f8e8d67e2f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.date(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: serialization.Schema = - serialization.date(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts deleted file mode 100644 index 39fad02041dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.number(); - -export declare namespace Request { - export type Raw = number; -} - -export const Response: serialization.Schema = - serialization.number(); - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts deleted file mode 100644 index 52a29cbb7b23..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.number(); - -export declare namespace Request { - export type Raw = number; -} - -export const Response: serialization.Schema = - serialization.number(); - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts deleted file mode 100644 index 8de6541f8cbf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.number(); - -export declare namespace Request { - export type Raw = number; -} - -export const Response: serialization.Schema = - serialization.number(); - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts deleted file mode 100644 index 230f9bfc7f6e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts deleted file mode 100644 index e11f5ffe387f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: serialization.Schema = - serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index 9805ab86b129..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as getAndReturnBase64 from "./getAndReturnBase64.js"; -export * as getAndReturnBool from "./getAndReturnBool.js"; -export * as getAndReturnDate from "./getAndReturnDate.js"; -export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; -export * as getAndReturnDouble from "./getAndReturnDouble.js"; -export * as getAndReturnInt from "./getAndReturnInt.js"; -export * as getAndReturnLong from "./getAndReturnLong.js"; -export * as getAndReturnString from "./getAndReturnString.js"; -export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index c1a5d0978baf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ErrorCategory: serialization.Schema< - serializers.endpoints.ErrorCategory.Raw, - SeedExhaustive.endpoints.ErrorCategory -> = serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); - -export declare namespace ErrorCategory { - export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index b8a7dbb5a29b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ErrorCode: serialization.Schema = - serialization.enum_([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", - ]); - -export declare namespace ErrorCode { - export type Raw = - | "INTERNAL_SERVER_ERROR" - | "UNAUTHORIZED" - | "FORBIDDEN" - | "BAD_REQUEST" - | "CONFLICT" - | "GONE" - | "UNPROCESSABLE_ENTITY" - | "NOT_IMPLEMENTED" - | "BAD_GATEWAY" - | "SERVICE_UNAVAILABLE" - | "Unknown"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 1f0e2699482d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ErrorCategory } from "./ErrorCategory.js"; -import { ErrorCode } from "./ErrorCode.js"; - -export const Error_: serialization.ObjectSchema = - serialization.object({ - category: ErrorCategory, - code: ErrorCode, - detail: serialization.string().optional(), - field: serialization.string().optional(), - }); - -export declare namespace Error_ { - export interface Raw { - category: ErrorCategory.Raw; - code: ErrorCode.Raw; - detail?: string | null; - field?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 7b07487770da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Error_ } from "./Error_.js"; - -export const PutResponse: serialization.ObjectSchema< - serializers.endpoints.PutResponse.Raw, - SeedExhaustive.endpoints.PutResponse -> = serialization.object({ - errors: serialization.list(Error_).optional(), -}); - -export declare namespace PutResponse { - export interface Raw { - errors?: Error_.Raw[] | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index 66e101cdc2d7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as noEndingSlash from "./noEndingSlash.js"; -export * as withEndingSlash from "./withEndingSlash.js"; -export * as withMixedCase from "./withMixedCase.js"; -export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts deleted file mode 100644 index e3b901d01021..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts deleted file mode 100644 index 4db7cfd2be32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts deleted file mode 100644 index 34921f105169..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts deleted file mode 100644 index 2d83f47ca591..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index dc034215328d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../api/index.js"; -import * as serialization from "../../../../core/schemas/index.js"; -import type * as serializers from "../../../index.js"; - -export const BadObjectRequestInfo: serialization.ObjectSchema< - serializers.BadObjectRequestInfo.Raw, - SeedExhaustive.BadObjectRequestInfo -> = serialization.object({ - message: serialization.string(), -}); - -export declare namespace BadObjectRequestInfo { - export interface Raw { - message: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts deleted file mode 100644 index 20b614a89e2f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index 7b4d13692e91..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,23 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../api/index.js"; -import * as serialization from "../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../index.js"; -import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; - -export const PostWithObjectBody: serialization.Schema< - serializers.PostWithObjectBody.Raw, - SeedExhaustive.PostWithObjectBody -> = serialization.object({ - string: serialization.string(), - integer: serialization.number(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), -}); - -export declare namespace PostWithObjectBody { - export interface Raw { - string: string; - integer: number; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index d62a81ce61fd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts deleted file mode 100644 index 549edcdba7f2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts deleted file mode 100644 index f7612cea2aaf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../core/schemas/index.js"; -import type * as serializers from "../../../index.js"; - -export const Response: serialization.Schema = - serialization.boolean(); - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts deleted file mode 100644 index b62616349ec6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts deleted file mode 100644 index 1e6dd32ad43e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../core/schemas/index.js"; -import type * as serializers from "../../../index.js"; - -export const Response: serialization.Schema = - serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts deleted file mode 100644 index 757092ecd703..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as serialization from "../../../../core/schemas/index.js"; -import type * as serializers from "../../../index.js"; - -export const Request: serialization.Schema = - serialization.string(); - -export declare namespace Request { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index fb7f25afb170..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index 84741ea03b10..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithDocs: serialization.ObjectSchema< - serializers.types.ObjectWithDocs.Raw, - SeedExhaustive.types.ObjectWithDocs -> = serialization.object({ - string: serialization.string(), -}); - -export declare namespace ObjectWithDocs { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index e2ef4f8b1761..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const WeatherReport: serialization.Schema< - serializers.types.WeatherReport.Raw, - SeedExhaustive.types.WeatherReport -> = serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); - -export declare namespace WeatherReport { - export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts deleted file mode 100644 index 52175f3cee16..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index 9abd1d7694aa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { OptionalAlias } from "./OptionalAlias.js"; - -export const DoubleOptional: serialization.ObjectSchema< - serializers.types.DoubleOptional.Raw, - SeedExhaustive.types.DoubleOptional -> = serialization.object({ - optionalAlias: OptionalAlias.optional(), -}); - -export declare namespace DoubleOptional { - export interface Raw { - optionalAlias?: (OptionalAlias.Raw | undefined) | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index 60110017a1f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,21 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -export const NestedObjectWithOptionalField: serialization.ObjectSchema< - serializers.types.NestedObjectWithOptionalField.Raw, - SeedExhaustive.types.NestedObjectWithOptionalField -> = serialization.object({ - string: serialization.string().optional(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField.optional()), -}); - -export declare namespace NestedObjectWithOptionalField { - export interface Raw { - string?: string | null; - NestedObject?: ObjectWithOptionalField.Raw | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index d80cf48ee660..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,21 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -export const NestedObjectWithRequiredField: serialization.ObjectSchema< - serializers.types.NestedObjectWithRequiredField.Raw, - SeedExhaustive.types.NestedObjectWithRequiredField -> = serialization.object({ - string: serialization.string(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), -}); - -export declare namespace NestedObjectWithRequiredField { - export interface Raw { - string: string; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index 04267ee70c58..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,21 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithMapOfMap: serialization.ObjectSchema< - serializers.types.ObjectWithMapOfMap.Raw, - SeedExhaustive.types.ObjectWithMapOfMap -> = serialization.object({ - map: serialization.record( - serialization.string(), - serialization.record(serialization.string(), serialization.string()), - ), -}); - -export declare namespace ObjectWithMapOfMap { - export interface Raw { - map: Record>; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 462e91e5c8db..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,42 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithOptionalField: serialization.ObjectSchema< - serializers.types.ObjectWithOptionalField.Raw, - SeedExhaustive.types.ObjectWithOptionalField -> = serialization.object({ - string: serialization.string().optional(), - integer: serialization.number().optional(), - long: serialization.number().optional(), - double: serialization.number().optional(), - bool: serialization.boolean().optional(), - datetime: serialization.date().optional(), - date: serialization.string().optional(), - uuid: serialization.string().optional(), - base64: serialization.string().optional(), - list: serialization.list(serialization.string()).optional(), - set: serialization.set(serialization.string()).optional(), - map: serialization.record(serialization.number(), serialization.string()).optional(), - bigint: serialization.string().optional(), -}); - -export declare namespace ObjectWithOptionalField { - export interface Raw { - string?: string | null; - integer?: number | null; - long?: number | null; - double?: number | null; - bool?: boolean | null; - datetime?: string | null; - date?: string | null; - uuid?: string | null; - base64?: string | null; - list?: string[] | null; - set?: string[] | null; - map?: Record | null; - bigint?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index ca11412dccbb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithRequiredField: serialization.ObjectSchema< - serializers.types.ObjectWithRequiredField.Raw, - SeedExhaustive.types.ObjectWithRequiredField -> = serialization.object({ - string: serialization.string(), -}); - -export declare namespace ObjectWithRequiredField { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index d684396d649e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const OptionalAlias: serialization.Schema< - serializers.types.OptionalAlias.Raw, - SeedExhaustive.types.OptionalAlias -> = serialization.string().optional(); - -export declare namespace OptionalAlias { - export type Raw = string | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index 8b7ba0c9d0ae..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Cat } from "./Cat.js"; -import { Dog } from "./Dog.js"; - -export const Animal: serialization.Schema = serialization - .union("animal", { - dog: Dog, - cat: Cat, - }) - .transform({ - transform: (value) => value, - untransform: (value) => value, - }); - -export declare namespace Animal { - export type Raw = Animal.Dog | Animal.Cat; - - export interface Dog extends Dog.Raw { - animal: "dog"; - } - - export interface Cat extends Cat.Raw { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index c040be8e6aed..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Cat: serialization.ObjectSchema = - serialization.object({ - name: serialization.string(), - likesToMeow: serialization.boolean(), - }); - -export declare namespace Cat { - export interface Raw { - name: string; - likesToMeow: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 5f6f040b3331..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Dog: serialization.ObjectSchema = - serialization.object({ - name: serialization.string(), - likesToWoof: serialization.boolean(), - }); - -export declare namespace Dog { - export interface Raw { - name: string; - likesToWoof: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts deleted file mode 100644 index b643a3e3ea27..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts +++ /dev/null @@ -1 +0,0 @@ -export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts deleted file mode 100644 index 7f5e031c8396..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This is a custom test file, if you wish to add more tests - * to your SDK. - * Be sure to mark this file in `.fernignore`. - * - * If you include example requests/responses in your fern definition, - * you will have tests automatically generated for you. - */ -describe("test", () => { - it("default", () => { - expect(true).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts deleted file mode 100644 index 954872157d52..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { RequestHandlerOptions } from "msw"; -import type { SetupServer } from "msw/node"; - -import { mockEndpointBuilder } from "./mockEndpointBuilder"; - -export interface MockServerOptions { - baseUrl: string; - server: SetupServer; -} - -export class MockServer { - private readonly server: SetupServer; - public readonly baseUrl: string; - - constructor({ baseUrl, server }: MockServerOptions) { - this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; - this.server = server; - } - - public mockEndpoint(options?: RequestHandlerOptions): ReturnType { - const builder = mockEndpointBuilder({ - once: options?.once ?? true, - onBuild: (handler) => { - this.server.use(handler); - }, - }).baseUrl(this.baseUrl); - return builder; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts deleted file mode 100644 index e1a90f7fb2e3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { setupServer } from "msw/node"; - -import { fromJson, toJson } from "../../src/core/json"; -import { MockServer } from "./MockServer"; -import { randomBaseUrl } from "./randomBaseUrl"; - -const mswServer = setupServer(); -interface MockServerOptions { - baseUrl?: string; -} - -async function formatHttpRequest(request: Request, id?: string): Promise { - try { - const clone = request.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Request ${id} ###\n` : ""; - const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting request: ${e}`; - } -} - -async function formatHttpResponse(response: Response, id?: string): Promise { - try { - const clone = response.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Response for ${id} ###\n` : ""; - const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting response: ${e}`; - } -} - -class MockServerPool { - private servers: MockServer[] = []; - - public createServer(options?: Partial): MockServer { - const baseUrl = options?.baseUrl || randomBaseUrl(); - const server = new MockServer({ baseUrl, server: mswServer }); - this.servers.push(server); - return server; - } - - public getServers(): MockServer[] { - return [...this.servers]; - } - - public listen(): void { - const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; - mswServer.listen({ onUnhandledRequest }); - - if (process.env.LOG_LEVEL === "debug") { - mswServer.events.on("request:start", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:start\n${formattedRequest}`); - }); - - mswServer.events.on("request:unhandled", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:unhandled\n${formattedRequest}`); - }); - - mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { - const formattedResponse = await formatHttpResponse(response, requestId); - console.debug(`response:mocked\n${formattedResponse}`); - }); - } - } - - public close(): void { - this.servers = []; - mswServer.close(); - } -} - -export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts deleted file mode 100644 index 1b0e51079e6b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; - -import { url } from "../../src/core"; -import { toJson } from "../../src/core/json"; -import { withFormUrlEncoded } from "./withFormUrlEncoded"; -import { withHeaders } from "./withHeaders"; -import { withJson } from "./withJson"; - -type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; - -interface MethodStage { - baseUrl(baseUrl: string): MethodStage; - all(path: string): RequestHeadersStage; - get(path: string): RequestHeadersStage; - post(path: string): RequestHeadersStage; - put(path: string): RequestHeadersStage; - delete(path: string): RequestHeadersStage; - patch(path: string): RequestHeadersStage; - options(path: string): RequestHeadersStage; - head(path: string): RequestHeadersStage; -} - -interface RequestHeadersStage extends RequestBodyStage, ResponseStage { - header(name: string, value: string): RequestHeadersStage; - headers(headers: Record): RequestBodyStage; -} - -interface RequestBodyStage extends ResponseStage { - jsonBody(body: unknown): ResponseStage; - formUrlEncodedBody(body: unknown): ResponseStage; -} - -interface ResponseStage { - respondWith(): ResponseStatusStage; -} -interface ResponseStatusStage { - statusCode(statusCode: number): ResponseHeaderStage; -} - -interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { - header(name: string, value: string): ResponseHeaderStage; - headers(headers: Record): ResponseHeaderStage; -} - -interface ResponseBodyStage { - jsonBody(body: unknown): BuildStage; -} - -interface BuildStage { - build(): HttpHandler; -} - -export interface HttpHandlerBuilderOptions { - onBuild?: (handler: HttpHandler) => void; - once?: boolean; -} - -class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { - private method: HttpMethod = "get"; - private _baseUrl: string = ""; - private path: string = "/"; - private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - constructor(options?: HttpHandlerBuilderOptions) { - this.handlerOptions = options; - } - - baseUrl(baseUrl: string): MethodStage { - this._baseUrl = baseUrl; - return this; - } - - all(path: string): RequestHeadersStage { - this.method = "all"; - this.path = path; - return this; - } - - get(path: string): RequestHeadersStage { - this.method = "get"; - this.path = path; - return this; - } - - post(path: string): RequestHeadersStage { - this.method = "post"; - this.path = path; - return this; - } - - put(path: string): RequestHeadersStage { - this.method = "put"; - this.path = path; - return this; - } - - delete(path: string): RequestHeadersStage { - this.method = "delete"; - this.path = path; - return this; - } - - patch(path: string): RequestHeadersStage { - this.method = "patch"; - this.path = path; - return this; - } - - options(path: string): RequestHeadersStage { - this.method = "options"; - this.path = path; - return this; - } - - head(path: string): RequestHeadersStage { - this.method = "head"; - this.path = path; - return this; - } - - header(name: string, value: string): RequestHeadersStage { - this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); - return this; - } - - headers(headers: Record): RequestBodyStage { - this.predicates.push((resolver) => withHeaders(headers, resolver)); - return this; - } - - jsonBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); - } - this.predicates.push((resolver) => withJson(body, resolver)); - return this; - } - - formUrlEncodedBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error( - "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", - ); - } - this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); - return this; - } - - respondWith(): ResponseStatusStage { - return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); - } - - private buildUrl(): string { - return url.join(this._baseUrl, this.path); - } -} - -class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { - private readonly method: HttpMethod; - private readonly url: string; - private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - private responseStatusCode: number = 200; - private responseHeaders: Record = {}; - private responseBody: DefaultBodyType = undefined; - - constructor( - method: HttpMethod, - url: string, - requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], - options?: HttpHandlerBuilderOptions, - ) { - this.method = method; - this.url = url; - this.requestPredicates = requestPredicates; - this.handlerOptions = options; - } - - public statusCode(code: number): ResponseHeaderStage { - this.responseStatusCode = code; - return this; - } - - public header(name: string, value: string): ResponseHeaderStage { - this.responseHeaders[name] = value; - return this; - } - - public headers(headers: Record): ResponseHeaderStage { - this.responseHeaders = { ...this.responseHeaders, ...headers }; - return this; - } - - public jsonBody(body: unknown): BuildStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); - } - this.responseBody = toJson(body); - return this; - } - - public build(): HttpHandler { - const responseResolver: HttpResponseResolver = () => { - const response = new HttpResponse(this.responseBody, { - status: this.responseStatusCode, - headers: this.responseHeaders, - }); - // if no Content-Type header is set, delete the default text content type that is set - if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { - response.headers.delete("Content-Type"); - } - return response; - }; - - const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); - - const handler = http[this.method](this.url, finalResolver, this.handlerOptions); - this.handlerOptions?.onBuild?.(handler); - return handler; - } -} - -export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { - return new RequestBuilder(options); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts deleted file mode 100644 index 031aa6408aca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function randomBaseUrl(): string { - const randomString = Math.random().toString(36).substring(2, 15); - return `http://${randomString}.localhost`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts deleted file mode 100644 index aeb3a95af7dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { afterAll, beforeAll } from "vitest"; - -import { mockServerPool } from "./MockServerPool"; - -beforeAll(() => { - mockServerPool.listen(); -}); -afterAll(() => { - mockServerPool.close(); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts deleted file mode 100644 index e9e6ff2d9cf1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: Record; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a form-urlencoded body."); - return passthrough(); - } - const params = new URLSearchParams(bodyText); - actualBody = {}; - for (const [key, value] of params.entries()) { - actualBody[key] = value; - } - } catch (error) { - console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).length > 0) { - console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - return { value: { actual, expected } }; - } - return {}; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if (actual[key] !== expected[key]) { - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts deleted file mode 100644 index 6599d2b4a92d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -/** - * Creates a request matcher that validates if request headers match specified criteria - * @param expectedHeaders - Headers to match against - * @param resolver - Response resolver to execute if headers match - */ -export function withHeaders( - expectedHeaders: Record boolean)>, - resolver: HttpResponseResolver, -): HttpResponseResolver { - return (args) => { - const { request } = args; - const { headers } = request; - - const mismatches: Record< - string, - { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } - > = {}; - - for (const [key, expectedValue] of Object.entries(expectedHeaders)) { - const actualValue = headers.get(key); - - if (actualValue === null) { - mismatches[key] = { actual: null, expected: expectedValue }; - continue; - } - - if (typeof expectedValue === "function") { - if (!expectedValue(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue instanceof RegExp) { - if (!expectedValue.test(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue !== actualValue) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } - - if (Object.keys(mismatches).length > 0) { - const formattedMismatches = formatHeaderMismatches(mismatches); - console.error("Header mismatch:", formattedMismatches); - return passthrough(); - } - - return resolver(args); - }; -} - -function formatHeaderMismatches( - mismatches: Record boolean) }>, -): Record { - const formatted: Record = {}; - - for (const [key, { actual, expected }] of Object.entries(mismatches)) { - formatted[key] = { - actual, - expected: - expected instanceof RegExp - ? expected.toString() - : typeof expected === "function" - ? "[Function]" - : expected, - }; - } - - return formatted; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts deleted file mode 100644 index b627638b015f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { fromJson, toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request JSON body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: unknown; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a JSON object."); - return passthrough(); - } - actualBody = fromJson(bodyText); - } catch (error) { - console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { - console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - return {}; - } - - if (Array.isArray(actual) && Array.isArray(expected)) { - if (actual.length !== expected.length) { - return { length: { actual: actual.length, expected: expected.length } }; - } - - const arrayMismatches: Record = {}; - for (let i = 0; i < actual.length; i++) { - const itemMismatches = findMismatches(actual[i], expected[i]); - if (Object.keys(itemMismatches).length > 0) { - for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { - arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; - } - } - } - return arrayMismatches; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; // Skip undefined values in actual - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; // Skip undefined values in expected - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if ( - typeof actual[key] === "object" && - actual[key] !== null && - typeof expected[key] === "object" && - expected[key] !== null - ) { - const nestedMismatches = findMismatches(actual[key], expected[key]); - if (Object.keys(nestedMismatches).length > 0) { - for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { - mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; - } - } - } else if (actual[key] !== expected[key]) { - if (areEquivalent(actual[key], expected[key])) { - continue; - } - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} - -function areEquivalent(actual: unknown, expected: unknown): boolean { - if (actual === expected) { - return true; - } - if (isEquivalentBigInt(actual, expected)) { - return true; - } - if (isEquivalentDatetime(actual, expected)) { - return true; - } - return false; -} - -function isEquivalentBigInt(actual: unknown, expected: unknown) { - if (typeof actual === "number") { - actual = BigInt(actual); - } - if (typeof expected === "number") { - expected = BigInt(expected); - } - if (typeof actual === "bigint" && typeof expected === "bigint") { - return actual === expected; - } - return false; -} - -function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { - if (typeof str1 !== "string" || typeof str2 !== "string") { - return false; - } - const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; - if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { - return false; - } - - try { - const date1 = new Date(str1).getTime(); - const date2 = new Date(str2).getTime(); - return date1 === date2; - } catch { - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts deleted file mode 100644 index a5651f81ba10..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { expect } from "vitest"; - -interface CustomMatchers { - toContainHeaders(expectedHeaders: Record): R; -} - -declare module "vitest" { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} - -expect.extend({ - toContainHeaders(actual: unknown, expectedHeaders: Record) { - const isHeaders = actual instanceof Headers; - const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); - - if (!isHeaders && !isPlainObject) { - throw new TypeError("Received value must be an instance of Headers or a plain object!"); - } - - if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { - throw new TypeError("Expected headers must be a plain object!"); - } - - const missingHeaders: string[] = []; - const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; - - for (const [key, value] of Object.entries(expectedHeaders)) { - let actualValue: string | null = null; - - if (isHeaders) { - // Headers.get() is already case-insensitive - actualValue = (actual as Headers).get(key); - } else { - // For plain objects, do case-insensitive lookup - const actualObj = actual as Record; - const lowerKey = key.toLowerCase(); - const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); - actualValue = foundKey ? actualObj[foundKey] : null; - } - - if (actualValue === null || actualValue === undefined) { - missingHeaders.push(key); - } else if (actualValue !== value) { - mismatchedHeaders.push({ key, expected: value, actual: actualValue }); - } - } - - const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; - - const actualType = isHeaders ? "Headers" : "object"; - - if (pass) { - return { - message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, - pass: true, - }; - } else { - const messages: string[] = []; - - if (missingHeaders.length > 0) { - messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); - } - - if (mismatchedHeaders.length > 0) { - const mismatches = mismatchedHeaders.map( - ({ key, expected, actual }) => - `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, - ); - messages.push(mismatches.join("\n")); - } - - return { - message: () => - `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, - pass: false, - }; - } - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json deleted file mode 100644 index a477df47920c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": null, - "rootDir": "..", - "baseUrl": "..", - "types": ["vitest/globals"] - }, - "include": ["../src", "../tests"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts deleted file mode 100644 index 9b5123364c47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { BasicAuth } from "../../../src/core/auth/BasicAuth"; - -describe("BasicAuth", () => { - interface ToHeaderTestCase { - description: string; - input: { username: string; password: string }; - expected: string; - } - - interface FromHeaderTestCase { - description: string; - input: string; - expected: { username: string; password: string }; - } - - interface ErrorTestCase { - description: string; - input: string; - expectedError: string; - } - - describe("toAuthorizationHeader", () => { - const toHeaderTests: ToHeaderTestCase[] = [ - { - description: "correctly converts to header", - input: { username: "username", password: "password" }, - expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - }, - ]; - - toHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); - }); - }); - }); - - describe("fromAuthorizationHeader", () => { - const fromHeaderTests: FromHeaderTestCase[] = [ - { - description: "correctly parses header", - input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - expected: { username: "username", password: "password" }, - }, - { - description: "handles password with colons", - input: "Basic dXNlcjpwYXNzOndvcmQ=", - expected: { username: "user", password: "pass:word" }, - }, - { - description: "handles empty username and password (just colon)", - input: "Basic Og==", - expected: { username: "", password: "" }, - }, - { - description: "handles empty username", - input: "Basic OnBhc3N3b3Jk", - expected: { username: "", password: "password" }, - }, - { - description: "handles empty password", - input: "Basic dXNlcm5hbWU6", - expected: { username: "username", password: "" }, - }, - ]; - - fromHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); - }); - }); - - const errorTests: ErrorTestCase[] = [ - { - description: "throws error for completely empty credentials", - input: "Basic ", - expectedError: "Invalid basic auth", - }, - { - description: "throws error for credentials without colon", - input: "Basic dXNlcm5hbWU=", - expectedError: "Invalid basic auth", - }, - ]; - - errorTests.forEach(({ description, input, expectedError }) => { - it(description, () => { - expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts deleted file mode 100644 index 7757b87cb97e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BearerToken } from "../../../src/core/auth/BearerToken"; - -describe("BearerToken", () => { - describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); - }); - }); - describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts deleted file mode 100644 index 939594ca277b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { base64Decode, base64Encode } from "../../src/core/base64"; - -describe("base64", () => { - describe("base64Encode", () => { - it("should encode ASCII strings", () => { - expect(base64Encode("hello")).toBe("aGVsbG8="); - expect(base64Encode("")).toBe(""); - }); - - it("should encode UTF-8 strings", () => { - expect(base64Encode("café")).toBe("Y2Fmw6k="); - expect(base64Encode("🎉")).toBe("8J+OiQ=="); - }); - - it("should handle basic auth credentials", () => { - expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); - }); - }); - - describe("base64Decode", () => { - it("should decode ASCII strings", () => { - expect(base64Decode("aGVsbG8=")).toBe("hello"); - expect(base64Decode("")).toBe(""); - }); - - it("should decode UTF-8 strings", () => { - expect(base64Decode("Y2Fmw6k=")).toBe("café"); - expect(base64Decode("8J+OiQ==")).toBe("🎉"); - }); - - it("should handle basic auth credentials", () => { - expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); - }); - }); - - describe("round-trip encoding", () => { - const testStrings = [ - "hello world", - "test@example.com", - "café", - "username:password", - "user@domain.com:super$ecret123!", - ]; - - testStrings.forEach((testString) => { - it(`should round-trip encode/decode: "${testString}"`, () => { - const encoded = base64Encode(testString); - const decoded = base64Decode(encoded); - expect(decoded).toBe(testString); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts deleted file mode 100644 index 60df2b5e4824..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts +++ /dev/null @@ -1,261 +0,0 @@ -import fs from "fs"; -import { join } from "path"; -import stream from "stream"; -import type { BinaryResponse } from "../../../src/core"; -import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -describe("Test fetcherImpl", () => { - it("should handle successful request", async () => { - const mockArgs: Fetcher.Args = { - url: "https://httpbin.org/post", - method: "POST", - headers: { "X-Test": "x-test-header" }, - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - maxRetries: 0, - responseType: "json", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - - expect(global.fetch).toHaveBeenCalledWith( - "https://httpbin.org/post", - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: JSON.stringify({ data: "test" }), - }), - ); - }); - - it("should send octet stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "POST", - headers: { "X-Test": "x-test-header" }, - contentType: "application/octet-stream", - requestType: "bytes", - maxRetries: 0, - responseType: "json", - body: fs.createReadStream(join(__dirname, "test-file.txt")), - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: expect.any(fs.ReadStream), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - }); - - it("should receive file as stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.stream).toBe("function"); - const stream = body.stream(); - expect(stream).toBeInstanceOf(ReadableStream); - const reader = stream.getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as blob", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.blob).toBe("function"); - const blob = await body.blob(); - expect(blob).toBeInstanceOf(Blob); - const reader = blob.stream().getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as arraybuffer", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.arrayBuffer).toBe("function"); - const arrayBuffer = await body.arrayBuffer(); - expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as bytes", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.bytes).toBe("function"); - if (!body.bytes) { - return; - } - const bytes = await body.bytes(); - expect(bytes).toBeInstanceOf(Uint8Array); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(bytes); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts deleted file mode 100644 index 2ec008e581d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; - -import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; -import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("HttpResponsePromise", () => { - const mockRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - const mockData = { id: "123", name: "test" }; - const mockWithRawResponse: WithRawResponse = { - data: mockData, - rawResponse: mockRawResponse, - }; - - describe("fromFunction", () => { - it("should create an HttpResponsePromise from a function", async () => { - const mockFn = vi - .fn<(arg1: string, arg2: string) => Promise>>() - .mockResolvedValue(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); - - const result = await responsePromise; - expect(result).toEqual(mockData); - expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromPromise", () => { - it("should create an HttpResponsePromise from a promise", async () => { - const promise = Promise.resolve(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromPromise(promise); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromExecutor", () => { - it("should create an HttpResponsePromise from an executor function", async () => { - const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { - resolve(mockWithRawResponse); - }); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromResult", () => { - it("should create an HttpResponsePromise from a result", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("Promise methods", () => { - let responsePromise: HttpResponsePromise; - - beforeEach(() => { - responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - }); - - it("should support then() method", async () => { - const result = await responsePromise.then((data) => ({ - ...data, - modified: true, - })); - - expect(result).toEqual({ - ...mockData, - modified: true, - }); - }); - - it("should support catch() method", async () => { - const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { - reject(new Error("Test error")); - }); - - const catchSpy = vi.fn(); - await errorResponsePromise.catch(catchSpy); - - expect(catchSpy).toHaveBeenCalled(); - const error = catchSpy.mock.calls[0]?.[0]; - expect(error).toBeInstanceOf(Error); - expect((error as Error).message).toBe("Test error"); - }); - - it("should support finally() method", async () => { - const finallySpy = vi.fn(); - await responsePromise.finally(finallySpy); - - expect(finallySpy).toHaveBeenCalled(); - }); - }); - - describe("withRawResponse", () => { - it("should return both data and raw response", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise.withRawResponse(); - - expect(result).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts deleted file mode 100644 index 375ee3f38064..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("RawResponse", () => { - describe("toRawResponse", () => { - it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { - const mockHeaders = new Headers({ "content-type": "application/json" }); - const mockResponse = { - body: "test body", - bodyUsed: false, - ok: true, - headers: mockHeaders, - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - - const result = toRawResponse(mockResponse as unknown as Response); - - expect("body" in result).toBe(false); - expect("bodyUsed" in result).toBe(false); - expect("ok" in result).toBe(false); - expect(result.headers).toBe(mockHeaders); - expect(result.redirected).toBe(false); - expect(result.status).toBe(200); - expect(result.statusText).toBe("OK"); - expect(result.type).toBe("basic"); - expect(result.url).toBe("https://example.com"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts deleted file mode 100644 index a92f1b5e81d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; - -describe("Test createRequestUrl", () => { - const BASE_URL = "https://api.example.com"; - - interface TestCase { - description: string; - baseUrl: string; - queryParams?: Record; - expected: string; - } - - const testCases: TestCase[] = [ - { - description: "should return the base URL when no query parameters are provided", - baseUrl: BASE_URL, - expected: BASE_URL, - }, - { - description: "should append simple query parameters", - baseUrl: BASE_URL, - queryParams: { key: "value", another: "param" }, - expected: "https://api.example.com?key=value&another=param", - }, - { - description: "should handle array query parameters", - baseUrl: BASE_URL, - queryParams: { items: ["a", "b", "c"] }, - expected: "https://api.example.com?items=a&items=b&items=c", - }, - { - description: "should handle object query parameters", - baseUrl: BASE_URL, - queryParams: { filter: { name: "John", age: 30 } }, - expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", - }, - { - description: "should handle mixed types of query parameters", - baseUrl: BASE_URL, - queryParams: { - simple: "value", - array: ["x", "y"], - object: { key: "value" }, - }, - expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", - }, - { - description: "should handle empty query parameters object", - baseUrl: BASE_URL, - queryParams: {}, - expected: BASE_URL, - }, - { - description: "should encode special characters in query parameters", - baseUrl: BASE_URL, - queryParams: { special: "a&b=c d" }, - expected: "https://api.example.com?special=a%26b%3Dc%20d", - }, - { - description: "should handle numeric values", - baseUrl: BASE_URL, - queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, - expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", - }, - { - description: "should handle boolean values", - baseUrl: BASE_URL, - queryParams: { enabled: true, disabled: false }, - expected: "https://api.example.com?enabled=true&disabled=false", - }, - { - description: "should handle null and undefined values", - baseUrl: BASE_URL, - queryParams: { - valid: "value", - nullValue: null, - undefinedValue: undefined, - emptyString: "", - }, - expected: "https://api.example.com?valid=value&nullValue=&emptyString=", - }, - { - description: "should handle deeply nested objects", - baseUrl: BASE_URL, - queryParams: { - user: { - profile: { - name: "John", - settings: { theme: "dark" }, - }, - }, - }, - expected: - "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle arrays of objects", - baseUrl: BASE_URL, - queryParams: { - users: [ - { name: "John", age: 30 }, - { name: "Jane", age: 25 }, - ], - }, - expected: - "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", - }, - { - description: "should handle mixed arrays", - baseUrl: BASE_URL, - queryParams: { - mixed: ["string", 42, true, { key: "value" }], - }, - expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", - }, - { - description: "should handle empty arrays", - baseUrl: BASE_URL, - queryParams: { emptyArray: [] }, - expected: BASE_URL, - }, - { - description: "should handle empty objects", - baseUrl: BASE_URL, - queryParams: { emptyObject: {} }, - expected: BASE_URL, - }, - { - description: "should handle special characters in keys", - baseUrl: BASE_URL, - queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, - expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", - }, - { - description: "should handle URL with existing query parameters", - baseUrl: "https://api.example.com?existing=param", - queryParams: { new: "value" }, - expected: "https://api.example.com?existing=param?new=value", - }, - { - description: "should handle complex nested structures", - baseUrl: BASE_URL, - queryParams: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - ]; - - testCases.forEach(({ description, baseUrl, queryParams, expected }) => { - it(description, () => { - expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts deleted file mode 100644 index 8a6c3a57e211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getRequestBody", () => { - interface TestCase { - description: string; - input: any; - type: "json" | "form" | "file" | "bytes" | "other"; - expected: any; - skipCondition?: () => boolean; - } - - const testCases: TestCase[] = [ - { - description: "should stringify body if not FormData in Node environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "node", - }, - { - description: "should stringify body if not FormData in browser environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "browser", - }, - { - description: "should return the Uint8Array", - input: new Uint8Array([1, 2, 3]), - type: "bytes", - expected: new Uint8Array([1, 2, 3]), - }, - { - description: "should serialize objects for form-urlencoded content type", - input: { username: "johndoe", email: "john@example.com" }, - type: "form", - expected: "username=johndoe&email=john%40example.com", - }, - { - description: "should serialize complex nested objects and arrays for form-urlencoded content type", - input: { - user: { - profile: { - name: "John Doe", - settings: { - theme: "dark", - notifications: true, - }, - }, - tags: ["admin", "user"], - contacts: [ - { type: "email", value: "john@example.com" }, - { type: "phone", value: "+1234567890" }, - ], - }, - filters: { - status: ["active", "pending"], - metadata: { - created: "2024-01-01", - categories: ["electronics", "books"], - }, - }, - preferences: ["notifications", "updates"], - }, - type: "form", - expected: - "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + - "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + - "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + - "user%5Btags%5D=admin&" + - "user%5Btags%5D=user&" + - "user%5Bcontacts%5D%5Btype%5D=email&" + - "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + - "user%5Bcontacts%5D%5Btype%5D=phone&" + - "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + - "filters%5Bstatus%5D=active&" + - "filters%5Bstatus%5D=pending&" + - "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + - "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + - "filters%5Bmetadata%5D%5Bcategories%5D=books&" + - "preferences=notifications&" + - "preferences=updates", - }, - { - description: "should return the input for pre-serialized form-urlencoded strings", - input: "key=value&another=param", - type: "other", - expected: "key=value&another=param", - }, - { - description: "should JSON stringify objects", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - }, - ]; - - testCases.forEach(({ description, input, type, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const result = await getRequestBody({ - body: input, - type, - }); - - if (input instanceof Uint8Array) { - expect(result).toBe(input); - } else { - expect(result).toBe(expected); - } - }); - }); - - it("should return FormData in browser environment", async () => { - if (RUNTIME.type === "browser") { - const formData = new FormData(); - formData.append("key", "value"); - const result = await getRequestBody({ - body: formData, - type: "file", - }); - expect(result).toBe(formData); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts deleted file mode 100644 index ad6be7fc2c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; - -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getResponseBody", () => { - interface SimpleTestCase { - description: string; - responseData: string | Record; - responseType?: "blob" | "sse" | "streaming" | "text"; - expected: any; - skipCondition?: () => boolean; - } - - const simpleTestCases: SimpleTestCase[] = [ - { - description: "should handle text response type", - responseData: "test text", - responseType: "text", - expected: "test text", - }, - { - description: "should handle JSON response", - responseData: { key: "value" }, - expected: { key: "value" }, - }, - { - description: "should handle empty response", - responseData: "", - expected: undefined, - }, - { - description: "should handle non-JSON response", - responseData: "invalid json", - expected: { - ok: false, - error: { - reason: "non-json", - statusCode: 200, - rawBody: "invalid json", - }, - }, - }, - ]; - - simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const mockResponse = new Response( - typeof responseData === "string" ? responseData : JSON.stringify(responseData), - ); - const result = await getResponseBody(mockResponse, responseType); - expect(result).toEqual(expected); - }); - }); - - it("should handle blob response type", async () => { - const mockBlob = new Blob(["test"], { type: "text/plain" }); - const mockResponse = new Response(mockBlob); - const result = await getResponseBody(mockResponse, "blob"); - // @ts-expect-error - expect(result.constructor.name).toBe("Blob"); - }); - - it("should handle sse response type", async () => { - if (RUNTIME.type === "node") { - const mockStream = new ReadableStream(); - const mockResponse = new Response(mockStream); - const result = await getResponseBody(mockResponse, "sse"); - expect(result).toBe(mockStream); - } - }); - - it("should handle streaming response type", async () => { - const encoder = new TextEncoder(); - const testData = "test stream data"; - const mockStream = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode(testData)); - controller.close(); - }, - }); - - const mockResponse = new Response(mockStream); - const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; - - expect(result).toBeInstanceOf(ReadableStream); - - const reader = result.getReader(); - const decoder = new TextDecoder(); - const { value } = await reader.read(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe(testData); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts deleted file mode 100644 index 366c9b6ced61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts +++ /dev/null @@ -1,517 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Fetcher Logging Integration", () => { - describe("Request Logging", () => { - it("should log successful request at debug level", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - headers: { "Content-Type": "application/json" }, - body: { test: "data" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - }), - hasBody: true, - }), - ); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - statusCode: 200, - }), - ); - }); - - it("should not log debug messages at info level for successful requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "info", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - }); - - it("should log request with body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: true, - }), - ); - }); - - it("should log request without body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: false, - }), - ); - }); - - it("should not log when silent mode is enabled", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: true, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should not log when no logging config is provided", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Error Logging", () => { - it("should log 4xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Not found" }, 404, "Not Found"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 404, - }), - ); - }); - - it("should log 5xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 500, - }), - ); - }); - - it("should log aborted request errors", async () => { - const mockLogger = createMockLogger(); - - const abortController = new AbortController(); - abortController.abort(); - - global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - abortSignal: abortController.signal, - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request was aborted", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - }), - ); - }); - - it("should log timeout errors", async () => { - const mockLogger = createMockLogger(); - - const timeoutError = new Error("Request timeout"); - timeoutError.name = "AbortError"; - - global.fetch = vi.fn().mockRejectedValue(timeoutError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request timed out", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - timeoutMs: undefined, - }), - ); - }); - - it("should log unknown errors", async () => { - const mockLogger = createMockLogger(); - - const unknownError = new Error("Unknown error"); - - global.fetch = vi.fn().mockRejectedValue(unknownError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - errorMessage: "Unknown error", - }), - ); - }); - }); - - describe("Logging with Redaction", () => { - it("should redact sensitive data in error logs", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]", - }), - ); - }); - }); - - describe("Different HTTP Methods", () => { - it("should log GET requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "GET", - }), - ); - }); - - it("should log POST requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - }), - ); - }); - - it("should log PUT requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "PUT", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "PUT", - }), - ); - }); - - it("should log DELETE requests", async () => { - const mockLogger = createMockLogger(); - global.fetch = vi.fn().mockResolvedValue( - new Response(null, { - status: 200, - statusText: "OK", - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "DELETE", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "DELETE", - }), - ); - }); - }); - - describe("Status Code Logging", () => { - it("should log 2xx success status codes", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 201, - }), - ); - }); - - it("should log 3xx redirect status codes as success", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 301, - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts deleted file mode 100644 index ea49466a55fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Mock } from "vitest"; -import { makeRequest } from "../../../src/core/fetcher/makeRequest"; - -describe("Test makeRequest", () => { - const mockPostUrl = "https://httpbin.org/post"; - const mockGetUrl = "https://httpbin.org/get"; - const mockHeaders = { "Content-Type": "application/json" }; - const mockBody = JSON.stringify({ key: "value" }); - - let mockFetch: Mock; - - beforeEach(() => { - mockFetch = vi.fn(); - mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); - }); - - it("should handle POST request correctly", async () => { - const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockPostUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "POST", - headers: mockHeaders, - body: mockBody, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); - - it("should handle GET request correctly", async () => { - const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockGetUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "GET", - headers: mockHeaders, - body: undefined, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts deleted file mode 100644 index d599376b9bcf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts +++ /dev/null @@ -1,1115 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Redacting Logic", () => { - describe("Header Redaction", () => { - it("should redact authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Authorization: "Bearer secret-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - }), - }), - ); - }); - - it("should redact api-key header (case-insensitive)", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-API-KEY": "secret-api-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-API-KEY": "[REDACTED]", - }), - }), - ); - }); - - it("should redact cookie header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Cookie: "session=abc123; token=xyz789" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Cookie: "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-auth-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "x-auth-token": "auth-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "x-auth-token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact proxy-authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "Proxy-Authorization": "Basic credentials" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Proxy-Authorization": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-csrf-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-CSRF-Token": "csrf-token-abc" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-CSRF-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact www-authenticate header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "WWW-Authenticate": "Bearer realm=example" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "WWW-Authenticate": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-session-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-Session-Token": "session-token-xyz" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-Session-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive headers", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }), - }), - ); - }); - - it("should redact multiple sensitive headers at once", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - Authorization: "Bearer token", - "X-API-Key": "api-key", - Cookie: "session=123", - "Content-Type": "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - "X-API-Key": "[REDACTED]", - Cookie: "[REDACTED]", - "Content-Type": "application/json", - }), - }), - ); - }); - }); - - describe("Response Header Redaction", () => { - it("should redact Set-Cookie in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "set-cookie": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact authorization in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Authorization", "Bearer token-123"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - authorization: "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact response headers in error responses", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - statusText: "Unauthorized", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "www-authenticate": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - }); - - describe("Query Parameter Redaction", () => { - it("should redact api_key query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { api_key: "secret-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - api_key: "[REDACTED]", - }), - }), - ); - }); - - it("should redact token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact access_token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { access_token: "secret-access-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - access_token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact password query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { password: "secret-password" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - password: "[REDACTED]", - }), - }), - ); - }); - - it("should redact secret query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { secret: "secret-value" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - secret: "[REDACTED]", - }), - }), - ); - }); - - it("should redact session_id query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { session_id: "session-123" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - session_id: "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - page: "1", - limit: "10", - sort: "name", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - page: "1", - limit: "10", - sort: "name", - }), - }), - ); - }); - - it("should not redact parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - author: "john", - authenticate: "false", - authorization_level: "user", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - author: "john", - authenticate: "false", - authorization_level: "user", - }), - }), - ); - }); - - it("should handle undefined query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: undefined, - }), - ); - }); - - it("should redact case-insensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - API_KEY: "[REDACTED]", - Token: "[REDACTED]", - }), - }), - ); - }); - }); - - describe("URL Redaction", () => { - it("should redact credentials in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:password@example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api", - }), - ); - }); - - it("should redact api_key in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret-key&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&page=1", - }), - ); - }); - - it("should redact token in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret-token", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should redact password in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?username=user&password=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?username=user&password=[REDACTED]", - }), - ); - }); - - it("should not redact non-sensitive query strings", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name", - }), - ); - }); - - it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - }), - ); - }); - - it("should handle URL with fragment", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret#section", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]#section", - }), - ); - }); - - it("should redact URL-encoded query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api%5Fkey=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api%5Fkey=[REDACTED]", - }), - ); - }); - - it("should handle URL without query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api", - }), - ); - }); - - it("should handle empty query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?", - }), - ); - }); - - it("should redact multiple sensitive parameters in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret1&token=secret2&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", - }), - ); - }); - - it("should redact both credentials and query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/api?token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should use fast path for URLs without sensitive keywords", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - }), - ); - }); - - it("should handle query parameter without value", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?flag&token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?flag&token=[REDACTED]", - }), - ); - }); - - it("should handle URL with multiple @ symbols in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user@example.com:pass@host.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@host.com/api", - }), - ); - }); - - it("should handle URL with @ in query parameter but not in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?email=user@example.com", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?email=user@example.com", - }), - ); - }); - - it("should handle URL with both credentials and @ in path", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/users/@username", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/users/@username", - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts deleted file mode 100644 index d22661367f4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -import type { Mock, MockInstance } from "vitest"; -import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; - -describe("requestWithRetries", () => { - let mockFetch: Mock; - let originalMathRandom: typeof Math.random; - let setTimeoutSpy: MockInstance; - - beforeEach(() => { - mockFetch = vi.fn(); - originalMathRandom = Math.random; - - Math.random = vi.fn(() => 0.5); - - vi.useFakeTimers({ - toFake: [ - "setTimeout", - "clearTimeout", - "setInterval", - "clearInterval", - "setImmediate", - "clearImmediate", - "Date", - "performance", - "requestAnimationFrame", - "cancelAnimationFrame", - "requestIdleCallback", - "cancelIdleCallback", - ], - }); - }); - - afterEach(() => { - Math.random = originalMathRandom; - vi.clearAllMocks(); - vi.clearAllTimers(); - }); - - it("should retry on retryable status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const retryableStatuses = [408, 429, 500, 502]; - let callCount = 0; - - mockFetch.mockImplementation(async () => { - if (callCount < retryableStatuses.length) { - return new Response("", { status: retryableStatuses[callCount++] }); - } - return new Response("", { status: 200 }); - }); - - const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); - expect(response.status).toBe(200); - }); - - it("should respect maxRetries limit", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const maxRetries = 2; - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - expect(response.status).toBe(500); - }); - - it("should not retry on success status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const successStatuses = [200, 201, 202]; - - for (const status of successStatuses) { - mockFetch.mockReset(); - setTimeoutSpy.mockClear(); - mockFetch.mockResolvedValueOnce(new Response("", { status })); - - const responsePromise = requestWithRetries(() => mockFetch(), 3); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(1); - expect(setTimeoutSpy).not.toHaveBeenCalled(); - } - }); - - interface RetryHeaderTestCase { - description: string; - headerName: string; - headerValue: string | (() => string); - expectedDelayMin: number; - expectedDelayMax: number; - } - - const retryHeaderTests: RetryHeaderTestCase[] = [ - { - description: "should respect retry-after header with seconds value", - headerName: "retry-after", - headerValue: "5", - expectedDelayMin: 4000, - expectedDelayMax: 6000, - }, - { - description: "should respect retry-after header with HTTP date value", - headerName: "retry-after", - headerValue: () => new Date(Date.now() + 3000).toUTCString(), - expectedDelayMin: 2000, - expectedDelayMax: 4000, - }, - { - description: "should respect x-ratelimit-reset header", - headerName: "x-ratelimit-reset", - headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), - expectedDelayMin: 3000, - expectedDelayMax: 6000, - }, - ]; - - retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { - it(description, async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const value = typeof headerValue === "function" ? headerValue() : headerValue; - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ [headerName]: value }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(expectedDelayMin); - expect(actualDelay).toBeLessThan(expectedDelayMax); - expect(response.status).toBe(200); - }); - }); - - it("should apply correct exponential backoff with jitter", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - const maxRetries = 3; - const expectedDelays = [1000, 2000, 4000]; - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); - - expectedDelays.forEach((delay, index) => { - expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); - }); - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - }); - - it("should handle concurrent retries independently", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 200 })) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const promise1 = requestWithRetries(() => mockFetch(), 1); - const promise2 = requestWithRetries(() => mockFetch(), 1); - - await vi.runAllTimersAsync(); - const [response1, response2] = await Promise.all([promise1, promise2]); - - expect(response1.status).toBe(200); - expect(response2.status).toBe(200); - }); - - it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); - expect(response.status).toBe(200); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts deleted file mode 100644 index d7b6d1e63caa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; - -describe("Test getTimeoutSignal", () => { - beforeEach(() => { - vi.useFakeTimers(); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - it("should return an object with signal and abortId", () => { - const { signal, abortId } = getTimeoutSignal(1000); - - expect(signal).toBeDefined(); - expect(abortId).toBeDefined(); - expect(signal).toBeInstanceOf(AbortSignal); - expect(signal.aborted).toBe(false); - }); - - it("should create a signal that aborts after the specified timeout", () => { - const timeoutMs = 5000; - const { signal } = getTimeoutSignal(timeoutMs); - - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(timeoutMs - 1); - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(1); - expect(signal.aborted).toBe(true); - }); -}); - -describe("Test anySignal", () => { - it("should return an AbortSignal", () => { - const signal = anySignal(new AbortController().signal); - expect(signal).toBeInstanceOf(AbortSignal); - }); - - it("should abort when any of the input signals is aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal(controller1.signal, controller2.signal); - - expect(signal.aborted).toBe(false); - controller1.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should handle an array of signals", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal([controller1.signal, controller2.signal]); - - expect(signal.aborted).toBe(false); - controller2.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should abort immediately if one of the input signals is already aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - controller1.abort(); - - const signal = anySignal(controller1.signal, controller2.signal); - expect(signal.aborted).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt deleted file mode 100644 index c66d471e359c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts deleted file mode 100644 index 2e0b5fe5040c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts +++ /dev/null @@ -1,454 +0,0 @@ -import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -describe("Logger", () => { - describe("LogLevel", () => { - it("should have correct log levels", () => { - expect(LogLevel.Debug).toBe("debug"); - expect(LogLevel.Info).toBe("info"); - expect(LogLevel.Warn).toBe("warn"); - expect(LogLevel.Error).toBe("error"); - }); - }); - - describe("ConsoleLogger", () => { - let consoleLogger: ConsoleLogger; - let consoleSpy: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - consoleLogger = new ConsoleLogger(); - consoleSpy = { - debug: vi.spyOn(console, "debug").mockImplementation(() => {}), - info: vi.spyOn(console, "info").mockImplementation(() => {}), - warn: vi.spyOn(console, "warn").mockImplementation(() => {}), - error: vi.spyOn(console, "error").mockImplementation(() => {}), - }; - }); - - afterEach(() => { - consoleSpy.debug.mockRestore(); - consoleSpy.info.mockRestore(); - consoleSpy.warn.mockRestore(); - consoleSpy.error.mockRestore(); - }); - - it("should log debug messages", () => { - consoleLogger.debug("debug message", { data: "test" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); - }); - - it("should log info messages", () => { - consoleLogger.info("info message", { data: "test" }); - expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); - }); - - it("should log warn messages", () => { - consoleLogger.warn("warn message", { data: "test" }); - expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); - }); - - it("should log error messages", () => { - consoleLogger.error("error message", { data: "test" }); - expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); - }); - - it("should handle multiple arguments", () => { - consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); - }); - }); - - describe("Logger with level filtering", () => { - let mockLogger: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - mockLogger = createMockLogger(); - }); - - describe("Debug level", () => { - it("should log all levels when set to debug", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).toHaveBeenCalledWith("debug"); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(true); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Info level", () => { - it("should log info, warn, and error when set to info", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Warn level", () => { - it("should log warn and error when set to warn", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Error level", () => { - it("should only log error when set to error", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Silent mode", () => { - it("should not log anything when silent is true", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should report all level checks as false when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(false); - }); - }); - - describe("shouldLog", () => { - it("should correctly determine if level should be logged", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(true); - expect(logger.shouldLog(LogLevel.Warn)).toBe(true); - expect(logger.shouldLog(LogLevel.Error)).toBe(true); - }); - - it("should return false for all levels when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - expect(logger.shouldLog(LogLevel.Warn)).toBe(false); - expect(logger.shouldLog(LogLevel.Error)).toBe(false); - }); - }); - - describe("Multiple arguments", () => { - it("should pass multiple arguments to logger", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message", "arg1", { key: "value" }, 123); - expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); - }); - }); - }); - - describe("createLogger", () => { - it("should return default logger when no config provided", () => { - const logger = createLogger(); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should return same logger instance when Logger is passed", () => { - const customLogger = new Logger({ - level: LogLevel.Debug, - logger: new ConsoleLogger(), - silent: false, - }); - - const result = createLogger(customLogger); - expect(result).toBe(customLogger); - }); - - it("should create logger with custom config", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger).toBeInstanceOf(Logger); - logger.warn("test"); - expect(mockLogger.warn).toHaveBeenCalledWith("test"); - }); - - it("should use default values for missing config", () => { - const logger = createLogger({}); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should override default level", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("test"); - expect(mockLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should override default silent mode", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - silent: false, - }); - - logger.info("test"); - expect(mockLogger.info).toHaveBeenCalledWith("test"); - }); - - it("should use provided logger implementation", () => { - const customLogger = createMockLogger(); - - const logger = createLogger({ - logger: customLogger, - level: LogLevel.Debug, - silent: false, - }); - - logger.debug("test"); - expect(customLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should default to silent: true", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - level: LogLevel.Debug, - }); - - logger.debug("test"); - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Default logger", () => { - it("should have silent: true by default", () => { - const logger = createLogger(); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - }); - - it("should not log when using default logger", () => { - const logger = createLogger(); - - logger.info("test"); - expect(logger.isInfo()).toBe(false); - }); - }); - - describe("Edge cases", () => { - it("should handle empty message", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug(""); - expect(mockLogger.debug).toHaveBeenCalledWith(""); - }); - - it("should handle no arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message"); - expect(mockLogger.debug).toHaveBeenCalledWith("message"); - }); - - it("should handle complex objects", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - const complexObject = { - nested: { key: "value" }, - array: [1, 2, 3], - fn: () => "test", - }; - - logger.debug("message", complexObject); - expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); - }); - - it("should handle errors as arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - const error = new Error("Test error"); - logger.error("Error occurred", error); - expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts deleted file mode 100644 index 498f143c7283..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { bigint } from "../../../../src/core/schemas/builders/bigint"; -import { itJson, itParse, itSchema } from "../utils/itSchema"; -import { itValidateJson, itValidateParse } from "../utils/itValidate"; - -describe("bigint", () => { - itSchema("converts between raw bigint and parsed bigint", bigint(), { - raw: BigInt("9007199254740992"), - parsed: BigInt("9007199254740992"), - }); - - itParse("converts between raw number and parsed bigint", bigint(), { - raw: 10, - parsed: BigInt("10"), - }); - - itParse("converts between raw number and parsed bigint", bigint(), { - raw: BigInt("10"), - parsed: BigInt("10"), - }); - - itJson("converts raw bigint to parsed bigint", bigint(), { - parsed: BigInt("10"), - raw: BigInt("10"), - }); - - itValidateParse("string", bigint(), "42", [ - { - message: 'Expected bigint | number. Received "42".', - path: [], - }, - ]); - - itValidateJson("number", bigint(), 42, [ - { - message: "Expected bigint. Received 42.", - path: [], - }, - ]); - - itValidateJson("string", bigint(), "42", [ - { - message: 'Expected bigint. Received "42".', - path: [], - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts deleted file mode 100644 index 2790268a09c6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { date } from "../../../../src/core/schemas/builders/date"; -import { itSchema } from "../utils/itSchema"; -import { itValidateJson, itValidateParse } from "../utils/itValidate"; - -describe("date", () => { - itSchema("converts between raw ISO string and parsed Date", date(), { - raw: "2022-09-29T05:41:21.939Z", - parsed: new Date("2022-09-29T05:41:21.939Z"), - }); - - itValidateParse("non-string", date(), 42, [ - { - message: "Expected string. Received 42.", - path: [], - }, - ]); - - itValidateParse("non-ISO", date(), "hello world", [ - { - message: 'Expected ISO 8601 date string. Received "hello world".', - path: [], - }, - ]); - - itValidateJson("non-Date", date(), "hello", [ - { - message: 'Expected Date object. Received "hello".', - path: [], - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts deleted file mode 100644 index d1707325b29b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { enum_ } from "../../../../src/core/schemas/builders/enum"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("enum", () => { - itSchemaIdentity(enum_(["A", "B", "C"]), "A"); - - itSchemaIdentity(enum_(["A", "B", "C"]), "D" as any, { - opts: { allowUnrecognizedEnumValues: true }, - }); - - itValidate("invalid enum", enum_(["A", "B", "C"]), "D", [ - { - message: 'Expected enum. Received "D".', - path: [], - }, - ]); - - itValidate( - "non-string", - enum_(["A", "B", "C"]), - [], - [ - { - message: "Expected string. Received list.", - path: [], - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts deleted file mode 100644 index a82ace4a08c0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { lazy, list, object, string } from "../../../../src/core/schemas/builders"; -import type { Schema } from "../../../../src/core/schemas/Schema"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("lazy", () => { - it("doesn't run immediately", () => { - let wasRun = false; - lazy(() => { - wasRun = true; - return string(); - }); - expect(wasRun).toBe(false); - }); - - it("only runs first time", async () => { - let count = 0; - const schema = lazy(() => { - count++; - return string(); - }); - await schema.parse("hello"); - await schema.json("world"); - expect(count).toBe(1); - }); - - itSchemaIdentity( - lazy(() => object({})), - { foo: "hello" }, - { - title: "passes opts through", - opts: { unrecognizedObjectKeys: "passthrough" }, - }, - ); - - itSchemaIdentity( - lazy(() => object({ foo: string() })), - { foo: "hello" }, - ); - - // eslint-disable-next-line vi/expect-expect - it("self-referencial schema doesn't compile", () => { - () => { - // @ts-expect-error - const a = lazy(() => object({ foo: a })); - }; - }); - - // eslint-disable-next-line vi/expect-expect - it("self-referencial compiles with explicit type", () => { - () => { - interface TreeNode { - children: TreeNode[]; - } - const TreeNode: Schema = lazy(() => object({ children: list(TreeNode) })); - }; - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts deleted file mode 100644 index 9b443671a71f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { lazyObject, number, object, string } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("lazy", () => { - itSchemaIdentity( - lazyObject(() => object({ foo: string() })), - { foo: "hello" }, - ); - - itSchemaIdentity( - lazyObject(() => object({ foo: string() })).extend(object({ bar: number() })), - { - foo: "hello", - bar: 42, - }, - { title: "returned schema has object utils" }, - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts deleted file mode 100644 index 8b7d5e40cfaf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { object } from "../../../../../src/core/schemas/builders/object"; -import { schemaB } from "./b"; - -// @ts-expect-error -export const schemaA = object({ - b: schemaB, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts deleted file mode 100644 index fb219d54c8e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { object } from "../../../../../src/core/schemas/builders/object"; -import { optional } from "../../../../../src/core/schemas/builders/schema-utils"; -import { schemaA } from "./a"; - -// @ts-expect-error -export const schemaB = object({ - a: optional(schemaA), -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts deleted file mode 100644 index 108789b7317d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { list, object, property, string } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("list", () => { - itSchemaIdentity(list(string()), ["hello", "world"], { - title: "functions as identity when item type is primitive", - }); - - itSchema( - "converts objects correctly", - list( - object({ - helloWorld: property("hello_world", string()), - }), - ), - { - raw: [{ hello_world: "123" }], - parsed: [{ helloWorld: "123" }], - }, - ); - - itValidate("not a list", list(string()), 42, [ - { - path: [], - message: "Expected list. Received 42.", - }, - ]); - - itValidate( - "invalid item type", - list(string()), - [42], - [ - { - path: ["[0]"], - message: "Expected string. Received 42.", - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts deleted file mode 100644 index fa6c88873c61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { stringLiteral } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("stringLiteral", () => { - itSchemaIdentity(stringLiteral("A"), "A"); - - itValidate("incorrect string", stringLiteral("A"), "B", [ - { - path: [], - message: 'Expected "A". Received "B".', - }, - ]); - - itValidate("non-string", stringLiteral("A"), 42, [ - { - path: [], - message: 'Expected "A". Received 42.', - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts deleted file mode 100644 index b18bc9d3e5df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; - -describe("withParsedProperties", () => { - it("Added properties included on parsed object", async () => { - const schema = object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }).withParsedProperties({ - printFoo: (parsed) => () => parsed.foo, - printHelloWorld: () => () => "Hello world", - helloWorld: "Hello world", - }); - - const parsed = await schema.parse({ raw_foo: "value of foo", bar: "bar" }); - if (!parsed.ok) { - throw new Error("Failed to parse"); - } - expect(parsed.value.printFoo()).toBe("value of foo"); - expect(parsed.value.printHelloWorld()).toBe("Hello world"); - expect(parsed.value.helloWorld).toBe("Hello world"); - }); - - it("Added property is removed on raw object", async () => { - const schema = object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }).withParsedProperties({ - printFoo: (parsed) => () => parsed.foo, - }); - - const original = { raw_foo: "value of foo", bar: "bar" } as const; - const parsed = await schema.parse(original); - if (!parsed.ok) { - throw new Error("Failed to parse()"); - } - - const raw = await schema.json(parsed.value); - - if (!raw.ok) { - throw new Error("Failed to json()"); - } - - expect(raw.value).toEqual(original); - }); - - describe("compile", () => { - // eslint-disable-next-line vi/expect-expect - it("doesn't compile with non-object schema", () => { - () => - object({ - foo: string(), - }) - // @ts-expect-error - .withParsedProperties(42); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts deleted file mode 100644 index b6c2920f4d3e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { boolean, object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; - -describe("extend", () => { - itSchemaIdentity( - object({ - foo: string(), - }).extend( - object({ - bar: stringLiteral("bar"), - }), - ), - { - foo: "", - bar: "bar", - } as const, - { - title: "extended properties are included in schema", - }, - ); - - itSchemaIdentity( - object({ - foo: string(), - }) - .extend( - object({ - bar: stringLiteral("bar"), - }), - ) - .extend( - object({ - baz: boolean(), - }), - ), - { - foo: "", - bar: "bar", - baz: true, - } as const, - { - title: "extensions can be extended", - }, - ); - - itSchema( - "converts nested object", - object({ - item: object({ - helloWorld: property("hello_world", string()), - }), - }).extend( - object({ - goodbye: property("goodbye_raw", string()), - }), - ), - { - raw: { item: { hello_world: "yo" }, goodbye_raw: "peace" }, - parsed: { item: { helloWorld: "yo" }, goodbye: "peace" }, - }, - ); - - itSchema( - "extensions work with raw/parsed property name conversions", - object({ - item: property("item_raw", string()), - }).extend( - object({ - goodbye: property("goodbye_raw", string()), - }), - ), - { - raw: { item_raw: "hi", goodbye_raw: "peace" }, - parsed: { item: "hi", goodbye: "peace" }, - }, - ); - - describe("compile", () => { - // eslint-disable-next-line vi/expect-expect - it("doesn't compile with non-object schema", () => { - () => - object({ - foo: string(), - }) - // @ts-expect-error - .extend([]); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts deleted file mode 100644 index a8d9fe0a1359..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts +++ /dev/null @@ -1,255 +0,0 @@ -import { any, number, object, property, string, stringLiteral, unknown } from "../../../../src/core/schemas/builders"; -import { itJson, itParse, itSchema, itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("object", () => { - itSchemaIdentity( - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - { - foo: "", - bar: "bar", - }, - { - title: "functions as identity when values are primitives and property() isn't used", - }, - ); - - itSchema( - "uses raw key from property()", - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { raw_foo: "foo", bar: "bar" }, - parsed: { foo: "foo", bar: "bar" }, - }, - ); - - itSchema( - "keys with unknown type can be omitted", - object({ - foo: unknown(), - }), - { - raw: {}, - parsed: {}, - }, - ); - - itSchema( - "keys with any type can be omitted", - object({ - foo: any(), - }), - { - raw: {}, - parsed: {}, - }, - ); - - describe("unrecognizedObjectKeys", () => { - describe("parse", () => { - itParse( - 'includes unknown values when unrecognizedObjectKeys === "passthrough"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - parsed: { - foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - opts: { - unrecognizedObjectKeys: "passthrough", - }, - }, - ); - - itParse( - 'strips unknown values when unrecognizedObjectKeys === "strip"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - parsed: { - foo: "foo", - bar: "bar", - }, - opts: { - unrecognizedObjectKeys: "strip", - }, - }, - ); - }); - - describe("json", () => { - itJson( - 'includes unknown values when unrecognizedObjectKeys === "passthrough"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - parsed: { - foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - opts: { - unrecognizedObjectKeys: "passthrough", - }, - }, - ); - - itJson( - 'strips unknown values when unrecognizedObjectKeys === "strip"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - }, - parsed: { - foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - opts: { - unrecognizedObjectKeys: "strip", - }, - }, - ); - }); - }); - - describe("nullish properties", () => { - itSchema("missing properties are not added", object({ foo: property("raw_foo", string().optional()) }), { - raw: {}, - parsed: {}, - }); - - itSchema("undefined properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }); - - itSchema("null properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }); - - describe("extensions", () => { - itSchema( - "undefined properties are not dropped", - object({}).extend(object({ foo: property("raw_foo", string().optional()) })), - { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }, - ); - - describe("parse()", () => { - itParse( - "null properties are not dropped", - object({}).extend(object({ foo: property("raw_foo", string().optional()) })), - { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }, - ); - }); - }); - }); - - itValidate( - "missing property", - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - { foo: "hello" }, - [ - { - path: [], - message: 'Missing required key "bar"', - }, - ], - ); - - itValidate( - "extra property", - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - { foo: "hello", bar: "bar", baz: 42 }, - [ - { - path: ["baz"], - message: 'Unexpected key "baz"', - }, - ], - ); - - itValidate( - "not an object", - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - [], - [ - { - path: [], - message: "Expected object. Received list.", - }, - ], - ); - - itValidate( - "nested validation error", - object({ - foo: object({ - bar: number(), - }), - }), - { foo: { bar: "hello" } }, - [ - { - path: ["foo", "bar"], - message: 'Expected number. Received "hello".', - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts deleted file mode 100644 index efcd83afae79..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { objectWithoutOptionalProperties, string, stringLiteral } from "../../../../src/core/schemas/builders"; -import { itSchema } from "../utils/itSchema"; - -describe("objectWithoutOptionalProperties", () => { - itSchema( - "all properties are required", - objectWithoutOptionalProperties({ - foo: string(), - bar: stringLiteral("bar").optional(), - }), - { - raw: { - foo: "hello", - }, - // @ts-expect-error - parsed: { - foo: "hello", - }, - }, - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts deleted file mode 100644 index c8770fca17dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { object, string, stringLiteral } from "../../../../src/core/schemas/builders"; -import { itJson, itParse, itSchema } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("passthrough", () => { - const baseSchema = object({ - foo: string(), - bar: stringLiteral("bar"), - }); - - describe("parse", () => { - itParse("includes unknown values", baseSchema.passthrough(), { - raw: { - foo: "hello", - bar: "bar", - baz: "extra", - }, - parsed: { - foo: "hello", - bar: "bar", - baz: "extra", - }, - }); - - itValidate( - "preserves schema validation", - baseSchema.passthrough(), - { - foo: 123, - bar: "bar", - baz: "extra", - }, - [ - { - path: ["foo"], - message: "Expected string. Received 123.", - }, - ], - ); - }); - - describe("json", () => { - itJson("includes unknown values", baseSchema.passthrough(), { - raw: { - foo: "hello", - bar: "bar", - - baz: "extra", - }, - parsed: { - foo: "hello", - bar: "bar", - - baz: "extra", - }, - }); - - itValidate( - "preserves schema validation", - baseSchema.passthrough(), - { - foo: "hello", - bar: "wrong", - baz: "extra", - }, - [ - { - path: ["bar"], - message: 'Expected "bar". Received "wrong".', - }, - ], - ); - }); - - itSchema("preserves schema validation in both directions", baseSchema.passthrough(), { - raw: { - foo: "hello", - bar: "bar", - extra: 42, - }, - parsed: { - foo: "hello", - bar: "bar", - extra: 42, - }, - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts deleted file mode 100644 index 1adbbe2a8380..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { any } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("any", () => { - itSchemaIdentity(any(), true); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts deleted file mode 100644 index 897a8295dca7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { boolean } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("boolean", () => { - itSchemaIdentity(boolean(), true); - - itValidate("non-boolean", boolean(), {}, [ - { - path: [], - message: "Expected boolean. Received object.", - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts deleted file mode 100644 index 1d18eba052ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { never } from "../../../../src/core/schemas/builders"; - -describe("never", () => { - it("always fails to parse", () => { - const schema = never(); - const result = schema.parse("test"); - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.errors).toHaveLength(1); - expect(result.errors[0]?.message).toBe("Expected never"); - } - }); - - it("always fails to json", () => { - const schema = never(); - const result = schema.json("test"); - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.errors).toHaveLength(1); - expect(result.errors[0]?.message).toBe("Expected never"); - } - }); - - it("fails with any value including undefined", () => { - const schema = never(); - expect(schema.parse(undefined).ok).toBe(false); - expect(schema.parse(null).ok).toBe(false); - expect(schema.parse(0).ok).toBe(false); - expect(schema.parse("").ok).toBe(false); - expect(schema.parse({}).ok).toBe(false); - expect(schema.parse([]).ok).toBe(false); - }); - - it("works when called without options parameter", () => { - const schema = never(); - // This tests that the default = {} parameter works correctly - const result = schema.parse("test"); - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.errors).toHaveLength(1); - expect(result.errors[0]?.message).toBe("Expected never"); - expect(result.errors[0]?.path).toEqual([]); - } - }); - - it("succeeds with skipValidation", () => { - const schema = never(); - const result = schema.parse("test", { skipValidation: true }); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toBe("test"); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts deleted file mode 100644 index 2d01415a60ba..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { number } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("number", () => { - itSchemaIdentity(number(), 42); - - itValidate("non-number", number(), "hello", [ - { - path: [], - message: 'Expected number. Received "hello".', - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts deleted file mode 100644 index 57b2368784ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { string } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("string", () => { - itSchemaIdentity(string(), "hello"); - - itValidate("non-string", string(), 42, [ - { - path: [], - message: "Expected string. Received 42.", - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts deleted file mode 100644 index 4d17a7dbd005..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { unknown } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("unknown", () => { - itSchemaIdentity(unknown(), true); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts deleted file mode 100644 index e07f3e7cb00d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { number, record, string } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("record", () => { - itSchemaIdentity(record(string(), string()), { hello: "world" }); - itSchemaIdentity(record(number(), string()), { 42: "world" }); - - itValidate( - "non-record", - record(number(), string()), - [], - [ - { - path: [], - message: "Expected object. Received list.", - }, - ], - ); - - itValidate("invalid key type", record(number(), string()), { hello: "world" }, [ - { - path: ["hello (key)"], - message: 'Expected number. Received "hello".', - }, - ]); - - itValidate("invalid value type", record(string(), number()), { hello: "world" }, [ - { - path: ["hello"], - message: 'Expected number. Received "world".', - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts deleted file mode 100644 index 822c3ca4e5a4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { object, string } from "../../../../src/core/schemas/builders"; -import { itSchema } from "../utils/itSchema"; - -describe("getSchemaUtils", () => { - describe("optional()", () => { - itSchema("optional fields allow original schema", string().optional(), { - raw: "hello", - parsed: "hello", - }); - - itSchema("optional fields are not required", string().optional(), { - raw: null, - parsed: undefined, - }); - }); - - describe("transform()", () => { - itSchema( - "transform and untransform run correctly", - string().transform({ - transform: (x) => `${x}X`, - untransform: (x) => (x as string).slice(0, -1), - }), - { - raw: "hello", - parsed: "helloX", - }, - ); - }); - - describe("parseOrThrow()", () => { - it("parses valid value", async () => { - const value = string().parseOrThrow("hello"); - expect(value).toBe("hello"); - }); - - it("throws on invalid value", async () => { - const value = () => object({ a: string(), b: string() }).parseOrThrow({ a: 24 }); - expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); - }); - }); - - describe("jsonOrThrow()", () => { - it("serializes valid value", async () => { - const value = string().jsonOrThrow("hello"); - expect(value).toBe("hello"); - }); - - it("throws on invalid value", async () => { - const value = () => object({ a: string(), b: string() }).jsonOrThrow({ a: 24 }); - expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); - }); - }); - - describe("omitUndefined", () => { - it("serializes undefined as null", async () => { - const value = object({ - a: string().optional(), - b: string().optional(), - }).jsonOrThrow({ - a: "hello", - b: undefined, - }); - expect(value).toEqual({ a: "hello", b: null }); - }); - - it("omits undefined values", async () => { - const value = object({ - a: string().optional(), - b: string().optional(), - }).jsonOrThrow( - { - a: "hello", - b: undefined, - }, - { - omitUndefined: true, - }, - ); - expect(value).toEqual({ a: "hello" }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts deleted file mode 100644 index 13842ff40157..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { - boolean, - discriminant, - list, - number, - object, - string, - stringLiteral, - union, -} from "../../../src/core/schemas/builders"; -import { booleanLiteral } from "../../../src/core/schemas/builders/literals/booleanLiteral"; -import { property } from "../../../src/core/schemas/builders/object/property"; -import { itSchema } from "./utils/itSchema"; - -describe("Schema", () => { - itSchema( - "large nested object", - object({ - a: string(), - b: stringLiteral("b value"), - c: property( - "raw_c", - list( - object({ - animal: union(discriminant("type", "_type"), { - dog: object({ value: boolean() }), - cat: object({ value: property("raw_cat", number()) }), - }), - }), - ), - ), - d: property("raw_d", boolean()), - e: booleanLiteral(true), - }), - { - raw: { - a: "hello", - b: "b value", - raw_c: [ - { - animal: { - _type: "dog", - value: true, - }, - }, - { - animal: { - _type: "cat", - raw_cat: 42, - }, - }, - ], - raw_d: false, - e: true, - }, - parsed: { - a: "hello", - b: "b value", - c: [ - { - animal: { - type: "dog", - value: true, - }, - }, - { - animal: { - type: "cat", - value: 42, - }, - }, - ], - d: false, - e: true, - }, - }, - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts deleted file mode 100644 index 53a1652c8bbb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { set, string } from "../../../../src/core/schemas/builders"; -import { itSchema } from "../utils/itSchema"; -import { itValidateJson, itValidateParse } from "../utils/itValidate"; - -describe("set", () => { - itSchema("converts between raw list and parsed Set", set(string()), { - raw: ["A", "B"], - parsed: new Set(["A", "B"]), - }); - - itValidateParse("not a list", set(string()), 42, [ - { - path: [], - message: "Expected list. Received 42.", - }, - ]); - - itValidateJson( - "not a Set", - set(string()), - [], - [ - { - path: [], - message: "Expected Set. Received list.", - }, - ], - ); - - itValidateParse( - "invalid item type", - set(string()), - [42], - [ - { - path: ["[0]"], - message: "Expected string. Received 42.", - }, - ], - ); - - itValidateJson("invalid item type", set(string()), new Set([42]), [ - { - path: ["[0]"], - message: "Expected string. Received 42.", - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts deleted file mode 100644 index 3283555949ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable no-console */ -import { boolean, number, object, property, string, undiscriminatedUnion } from "../../../src/core/schemas/builders"; - -describe("skipValidation", () => { - it("allows data that doesn't conform to the schema", async () => { - const warningLogs: string[] = []; - const originalConsoleWarn = console.warn; - console.warn = (...args) => warningLogs.push(args.join(" ")); - - const schema = object({ - camelCase: property("snake_case", string()), - numberProperty: number(), - requiredProperty: boolean(), - anyPrimitive: undiscriminatedUnion([string(), number(), boolean()]), - }); - - const parsed = await schema.parse( - { - snake_case: "hello", - numberProperty: "oops", - anyPrimitive: true, - }, - { - skipValidation: true, - }, - ); - - expect(parsed).toEqual({ - ok: true, - value: { - camelCase: "hello", - numberProperty: "oops", - anyPrimitive: true, - }, - }); - - expect(warningLogs).toEqual([ - `Failed to validate. - - numberProperty: Expected number. Received "oops".`, - ]); - - console.warn = originalConsoleWarn; - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts deleted file mode 100644 index 01dcadbba37b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { number, object, property, string, undiscriminatedUnion } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; - -describe("undiscriminatedUnion", () => { - itSchemaIdentity(undiscriminatedUnion([string(), number()]), "hello world"); - - itSchemaIdentity(undiscriminatedUnion([object({ hello: string() }), object({ goodbye: string() })]), { - goodbye: "foo", - }); - - itSchema( - "Correctly transforms", - undiscriminatedUnion([object({ hello: string() }), object({ helloWorld: property("hello_world", string()) })]), - { - raw: { hello_world: "foo " }, - parsed: { helloWorld: "foo " }, - }, - ); - - it("Returns errors for all variants", async () => { - const result = await undiscriminatedUnion([string(), number()]).parse(true); - if (result.ok) { - throw new Error("Unexpectedly passed validation"); - } - expect(result.errors).toEqual([ - { - message: "[Variant 0] Expected string. Received true.", - path: [], - }, - { - message: "[Variant 1] Expected number. Received true.", - path: [], - }, - ]); - }); - - describe("compile", () => { - // eslint-disable-next-line vi/expect-expect - it("doesn't compile with zero members", () => { - // @ts-expect-error - () => undiscriminatedUnion([]); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts deleted file mode 100644 index 1f5d7a8fad5c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { boolean, discriminant, number, object, string, union } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("union", () => { - itSchemaIdentity( - union("type", { - lion: object({ - meows: boolean(), - }), - giraffe: object({ - heightInInches: number(), - }), - }), - { type: "lion", meows: true }, - { title: "doesn't transform discriminant when it's a string" }, - ); - - itSchema( - "transforms discriminant when it's a discriminant()", - union(discriminant("type", "_type"), { - lion: object({ meows: boolean() }), - giraffe: object({ heightInInches: number() }), - }), - { - raw: { _type: "lion", meows: true }, - parsed: { type: "lion", meows: true }, - }, - ); - - describe("allowUnrecognizedUnionMembers", () => { - itSchema( - "transforms discriminant & passes through values when discriminant value is unrecognized", - union(discriminant("type", "_type"), { - lion: object({ meows: boolean() }), - giraffe: object({ heightInInches: number() }), - }), - { - // @ts-expect-error - raw: { _type: "moose", isAMoose: true }, - // @ts-expect-error - parsed: { type: "moose", isAMoose: true }, - opts: { - allowUnrecognizedUnionMembers: true, - }, - }, - ); - }); - - describe("withParsedProperties", () => { - it("Added property is included on parsed object", async () => { - const schema = union("type", { - lion: object({}), - tiger: object({ value: string() }), - }).withParsedProperties({ - printType: (parsed) => () => parsed.type, - }); - - const parsed = await schema.parse({ type: "lion" }); - if (!parsed.ok) { - throw new Error("Failed to parse"); - } - expect(parsed.value.printType()).toBe("lion"); - }); - }); - - itValidate( - "non-object", - union("type", { - lion: object({}), - tiger: object({ value: string() }), - }), - [], - [ - { - path: [], - message: "Expected object. Received list.", - }, - ], - ); - - itValidate( - "missing discriminant", - union("type", { - lion: object({}), - tiger: object({ value: string() }), - }), - {}, - [ - { - path: [], - message: 'Missing discriminant ("type")', - }, - ], - ); - - itValidate( - "unrecognized discriminant value", - union("type", { - lion: object({}), - tiger: object({ value: string() }), - }), - { - type: "bear", - }, - [ - { - path: ["type"], - message: 'Expected enum. Received "bear".', - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts deleted file mode 100644 index 25b13e643207..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable vi/no-export */ -import type { Schema, SchemaOptions } from "../../../../src/core/schemas/Schema"; - -export function itSchemaIdentity( - schema: Schema, - value: T, - { title = "functions as identity", opts }: { title?: string; opts?: SchemaOptions } = {}, -): void { - itSchema(title, schema, { raw: value, parsed: value, opts }); -} - -export function itSchema( - title: string, - schema: Schema, - { - raw, - parsed, - opts, - only = false, - }: { - raw: Raw; - parsed: Parsed; - opts?: SchemaOptions; - only?: boolean; - }, -): void { - // eslint-disable-next-line vi/valid-title - (only ? describe.only : describe)(title, () => { - itParse("parse()", schema, { raw, parsed, opts }); - itJson("json()", schema, { raw, parsed, opts }); - }); -} - -export function itParse( - title: string, - schema: Schema, - { - raw, - parsed, - opts, - }: { - raw: Raw; - parsed: Parsed; - opts?: SchemaOptions; - }, -): void { - // eslint-disable-next-line vi/valid-title - it(title, () => { - const maybeValid = schema.parse(raw, opts); - if (!maybeValid.ok) { - throw new Error(`Failed to parse() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); - } - expect(maybeValid.value).toStrictEqual(parsed); - }); -} - -export function itJson( - title: string, - schema: Schema, - { - raw, - parsed, - opts, - }: { - raw: Raw; - parsed: Parsed; - opts?: SchemaOptions; - }, -): void { - // eslint-disable-next-line vi/valid-title - it(title, () => { - const maybeValid = schema.json(parsed, opts); - if (!maybeValid.ok) { - throw new Error(`Failed to json() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); - } - expect(maybeValid.value).toStrictEqual(raw); - }); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts deleted file mode 100644 index 60bc56c123cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable vi/no-export */ -import type { Schema, SchemaOptions, ValidationError } from "../../../../src/core/schemas/Schema"; - -export function itValidate( - title: string, - schema: Schema, - input: unknown, - errors: ValidationError[], - opts?: SchemaOptions, -): void { - // eslint-disable-next-line vi/valid-title - describe("parse()", () => { - itValidateParse(title, schema, input, errors, opts); - }); - describe("json()", () => { - itValidateJson(title, schema, input, errors, opts); - }); -} - -export function itValidateParse( - title: string, - schema: Schema, - raw: unknown, - errors: ValidationError[], - opts?: SchemaOptions, -): void { - describe("parse", () => { - // eslint-disable-next-line vi/valid-title - it(title, async () => { - const maybeValid = await schema.parse(raw, opts); - if (maybeValid.ok) { - throw new Error("Value passed validation"); - } - expect(maybeValid.errors).toStrictEqual(errors); - }); - }); -} - -export function itValidateJson( - title: string, - schema: Schema, - parsed: unknown, - errors: ValidationError[], - opts?: SchemaOptions, -): void { - describe("json", () => { - // eslint-disable-next-line vi/valid-title - it(title, async () => { - const maybeValid = await schema.json(parsed, opts); - if (maybeValid.ok) { - throw new Error("Value passed validation"); - } - expect(maybeValid.errors).toStrictEqual(errors); - }); - }); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts deleted file mode 100644 index 123488f084ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { join } from "../../../src/core/url/index"; - -describe("join", () => { - interface TestCase { - description: string; - base: string; - segments: string[]; - expected: string; - } - - describe("basic functionality", () => { - const basicTests: TestCase[] = [ - { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, - { - description: "should return empty string for empty base with path", - base: "", - segments: ["path"], - expected: "", - }, - { - description: "should handle single segment", - base: "base", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with trailing slash on base", - base: "base/", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with leading slash", - base: "base", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with both slashes", - base: "base/", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle multiple segments", - base: "base", - segments: ["path1", "path2", "path3"], - expected: "base/path1/path2/path3", - }, - { - description: "should handle multiple segments with slashes", - base: "base/", - segments: ["/path1/", "/path2/", "/path3/"], - expected: "base/path1/path2/path3/", - }, - ]; - - basicTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("URL handling", () => { - const urlTests: TestCase[] = [ - { - description: "should handle absolute URLs", - base: "https://example.com", - segments: ["api", "v1"], - expected: "https://example.com/api/v1", - }, - { - description: "should handle absolute URLs with slashes", - base: "https://example.com/", - segments: ["/api/", "/v1/"], - expected: "https://example.com/api/v1/", - }, - { - description: "should handle absolute URLs with base path", - base: "https://example.com/base", - segments: ["api", "v1"], - expected: "https://example.com/base/api/v1", - }, - { - description: "should preserve URL query parameters", - base: "https://example.com?query=1", - segments: ["api"], - expected: "https://example.com/api?query=1", - }, - { - description: "should preserve URL fragments", - base: "https://example.com#fragment", - segments: ["api"], - expected: "https://example.com/api#fragment", - }, - { - description: "should preserve URL query and fragments", - base: "https://example.com?query=1#fragment", - segments: ["api"], - expected: "https://example.com/api?query=1#fragment", - }, - { - description: "should handle http protocol", - base: "http://example.com", - segments: ["api"], - expected: "http://example.com/api", - }, - { - description: "should handle ftp protocol", - base: "ftp://example.com", - segments: ["files"], - expected: "ftp://example.com/files", - }, - { - description: "should handle ws protocol", - base: "ws://example.com", - segments: ["socket"], - expected: "ws://example.com/socket", - }, - { - description: "should fallback to path joining for malformed URLs", - base: "not-a-url://", - segments: ["path"], - expected: "not-a-url:///path", - }, - ]; - - urlTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("edge cases", () => { - const edgeCaseTests: TestCase[] = [ - { - description: "should handle empty segments", - base: "base", - segments: ["", "path"], - expected: "base/path", - }, - { - description: "should handle null segments", - base: "base", - segments: [null as any, "path"], - expected: "base/path", - }, - { - description: "should handle undefined segments", - base: "base", - segments: [undefined as any, "path"], - expected: "base/path", - }, - { - description: "should handle segments with only single slash", - base: "base", - segments: ["/", "path"], - expected: "base/path", - }, - { - description: "should handle segments with only double slash", - base: "base", - segments: ["//", "path"], - expected: "base/path", - }, - { - description: "should handle base paths with trailing slashes", - base: "base/", - segments: ["path"], - expected: "base/path", - }, - { - description: "should handle complex nested paths", - base: "api/v1/", - segments: ["/users/", "/123/", "/profile"], - expected: "api/v1/users/123/profile", - }, - ]; - - edgeCaseTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("real-world scenarios", () => { - const realWorldTests: TestCase[] = [ - { - description: "should handle API endpoint construction", - base: "https://api.example.com/v1", - segments: ["users", "123", "posts"], - expected: "https://api.example.com/v1/users/123/posts", - }, - { - description: "should handle file path construction", - base: "/var/www", - segments: ["html", "assets", "images"], - expected: "/var/www/html/assets/images", - }, - { - description: "should handle relative path construction", - base: "../parent", - segments: ["child", "grandchild"], - expected: "../parent/child/grandchild", - }, - { - description: "should handle Windows-style paths", - base: "C:\\Users", - segments: ["Documents", "file.txt"], - expected: "C:\\Users/Documents/file.txt", - }, - ]; - - realWorldTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("performance scenarios", () => { - it("should handle many segments efficiently", () => { - const segments = Array(100).fill("segment"); - const result = join("base", ...segments); - expect(result).toBe(`base/${segments.join("/")}`); - }); - - it("should handle long URLs", () => { - const longPath = "a".repeat(1000); - expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); - }); - }); - - describe("trailing slash preservation", () => { - const trailingSlashTests: TestCase[] = [ - { - description: - "should preserve trailing slash on final result when base has trailing slash and no segments", - base: "https://api.example.com/", - segments: [], - expected: "https://api.example.com/", - }, - { - description: "should preserve trailing slash on v1 path", - base: "https://api.example.com/v1/", - segments: [], - expected: "https://api.example.com/v1/", - }, - { - description: "should preserve trailing slash when last segment has trailing slash", - base: "https://api.example.com", - segments: ["users/"], - expected: "https://api.example.com/users/", - }, - { - description: "should preserve trailing slash with relative path", - base: "api/v1", - segments: ["users/"], - expected: "api/v1/users/", - }, - { - description: "should preserve trailing slash with multiple segments", - base: "https://api.example.com", - segments: ["v1", "collections/"], - expected: "https://api.example.com/v1/collections/", - }, - { - description: "should preserve trailing slash with base path", - base: "base", - segments: ["path1", "path2/"], - expected: "base/path1/path2/", - }, - ]; - - trailingSlashTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts deleted file mode 100644 index 42cdffb9e5ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { toQueryString } from "../../../src/core/url/index"; - -describe("Test qs toQueryString", () => { - interface BasicTestCase { - description: string; - input: any; - expected: string; - } - - describe("Basic functionality", () => { - const basicTests: BasicTestCase[] = [ - { description: "should return empty string for null", input: null, expected: "" }, - { description: "should return empty string for undefined", input: undefined, expected: "" }, - { description: "should return empty string for string primitive", input: "hello", expected: "" }, - { description: "should return empty string for number primitive", input: 42, expected: "" }, - { description: "should return empty string for true boolean", input: true, expected: "" }, - { description: "should return empty string for false boolean", input: false, expected: "" }, - { description: "should handle empty objects", input: {}, expected: "" }, - { - description: "should handle simple key-value pairs", - input: { name: "John", age: 30 }, - expected: "name=John&age=30", - }, - ]; - - basicTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Array handling", () => { - interface ArrayTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const arrayTests: ArrayTestCase[] = [ - { - description: "should handle arrays with indices format (default)", - input: { items: ["a", "b", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", - }, - { - description: "should handle arrays with repeat format", - input: { items: ["a", "b", "c"] }, - options: { arrayFormat: "repeat" }, - expected: "items=a&items=b&items=c", - }, - { - description: "should handle empty arrays", - input: { items: [] }, - expected: "", - }, - { - description: "should handle arrays with mixed types", - input: { mixed: ["string", 42, true, false] }, - expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", - }, - { - description: "should handle arrays with objects", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", - }, - { - description: "should handle arrays with objects in repeat format", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - options: { arrayFormat: "repeat" }, - expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", - }, - ]; - - arrayTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Nested objects", () => { - const nestedTests: BasicTestCase[] = [ - { - description: "should handle nested objects", - input: { user: { name: "John", age: 30 } }, - expected: "user%5Bname%5D=John&user%5Bage%5D=30", - }, - { - description: "should handle deeply nested objects", - input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, - expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle empty nested objects", - input: { user: {} }, - expected: "", - }, - ]; - - nestedTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Encoding", () => { - interface EncodingTestCase { - description: string; - input: any; - options?: { encode?: boolean }; - expected: string; - } - - const encodingTests: EncodingTestCase[] = [ - { - description: "should encode by default", - input: { name: "John Doe", email: "john@example.com" }, - expected: "name=John%20Doe&email=john%40example.com", - }, - { - description: "should not encode when encode is false", - input: { name: "John Doe", email: "john@example.com" }, - options: { encode: false }, - expected: "name=John Doe&email=john@example.com", - }, - { - description: "should encode special characters in keys", - input: { "user name": "John", "email[primary]": "john@example.com" }, - expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", - }, - { - description: "should not encode special characters in keys when encode is false", - input: { "user name": "John", "email[primary]": "john@example.com" }, - options: { encode: false }, - expected: "user name=John&email[primary]=john@example.com", - }, - ]; - - encodingTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Mixed scenarios", () => { - interface MixedTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const mixedTests: MixedTestCase[] = [ - { - description: "should handle complex nested structures", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle complex nested structures with repeat format", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - options: { arrayFormat: "repeat" }, - expected: - "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle arrays with null/undefined values", - input: { items: ["a", null, "c", undefined, "e"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", - }, - { - description: "should handle objects with null/undefined values", - input: { name: "John", age: null, email: undefined, active: true }, - expected: "name=John&age=&active=true", - }, - ]; - - mixedTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Edge cases", () => { - const edgeCaseTests: BasicTestCase[] = [ - { - description: "should handle numeric keys", - input: { "0": "zero", "1": "one" }, - expected: "0=zero&1=one", - }, - { - description: "should handle boolean values in objects", - input: { enabled: true, disabled: false }, - expected: "enabled=true&disabled=false", - }, - { - description: "should handle empty strings", - input: { name: "", description: "test" }, - expected: "name=&description=test", - }, - { - description: "should handle zero values", - input: { count: 0, price: 0.0 }, - expected: "count=0&price=0", - }, - { - description: "should handle arrays with empty strings", - input: { items: ["a", "", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", - }, - ]; - - edgeCaseTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Options combinations", () => { - interface OptionsTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; - expected: string; - } - - const optionsTests: OptionsTestCase[] = [ - { - description: "should respect both arrayFormat and encode options", - input: { items: ["a & b", "c & d"] }, - options: { arrayFormat: "repeat", encode: false }, - expected: "items=a & b&items=c & d", - }, - { - description: "should use default options when none provided", - input: { items: ["a", "b"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b", - }, - { - description: "should merge provided options with defaults", - input: { items: ["a", "b"], name: "John Doe" }, - options: { encode: false }, - expected: "items[0]=a&items[1]=b&name=John Doe", - }, - ]; - - optionsTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts deleted file mode 100644 index 98b9ec0c58b9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContainerClient", () => { - test("getAndReturnListOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string", "string"]; - const rawResponseBody = ["string", "string"]; - server - .mockEndpoint() - .post("/container/list-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - expect(response).toEqual(["string", "string"]); - }); - - test("getAndReturnListOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }, { string: "string" }]; - const rawResponseBody = [{ string: "string" }, { string: "string" }]; - server - .mockEndpoint() - .post("/container/list-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfObjects([ - { - string: "string", - }, - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - { - string: "string", - }, - ]); - }); - - test("getAndReturnSetOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string"]; - const rawResponseBody = ["string"]; - server - .mockEndpoint() - .post("/container/set-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - expect(response).toEqual(new Set(["string"])); - }); - - test("getAndReturnSetOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }]; - const rawResponseBody = [{ string: "string" }]; - server - .mockEndpoint() - .post("/container/set-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfObjects([ - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - ]); - }); - - test("getAndReturnMapPrimToPrim", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/map-prim-to-prim") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnMapOfPrimToObject", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: { string: "string" } }; - const rawResponseBody = { string: { string: "string" } }; - server - .mockEndpoint() - .post("/container/map-prim-to-object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ - string: { - string: "string", - }, - }); - expect(response).toEqual({ - string: { - string: "string", - }, - }); - }); - - test("getAndReturnOptional", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/opt-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnOptional({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts deleted file mode 100644 index 4bc8916f7ce5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContentTypeClient", () => { - test("postJsonPatchContentType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); - - test("postJsonPatchContentWithCharsetType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts deleted file mode 100644 index 5770be42a097..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("EnumClient", () => { - test("getAndReturnEnum", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SUNNY"; - const rawResponseBody = "SUNNY"; - server - .mockEndpoint() - .post("/enum") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); - expect(response).toEqual("SUNNY"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts deleted file mode 100644 index b9e26c032ff9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts +++ /dev/null @@ -1,212 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("HttpMethodsClient", () => { - test("testGet", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.httpMethods.testGet("id"); - expect(response).toEqual("string"); - }); - - test("testPost", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/http-methods") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPost({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPut", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .put("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPut("id", { - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPatch", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .patch("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testDelete", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = true; - server - .mockEndpoint() - .delete("/http-methods/id") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testDelete("id"); - expect(response).toEqual(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts deleted file mode 100644 index 685826602e5e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts +++ /dev/null @@ -1,448 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ObjectClient", () => { - test("getAndReturnWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/object/get-and-return-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("getAndReturnWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/object/get-and-return-with-required-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnWithMapOfMap", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { map: { map: { map: "map" } } }; - const rawResponseBody = { map: { map: { map: "map" } } }; - server - .mockEndpoint() - .post("/object/get-and-return-with-map-of-map") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - map: { - map: "map", - }, - }, - }); - expect(response).toEqual({ - map: { - map: { - map: "map", - }, - }, - }); - }); - - test("getAndReturnNestedWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredFieldAsList", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - ]; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field-list") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - ]); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts deleted file mode 100644 index be2e7ddd6591..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ParamsClient", () => { - test("getWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithPath("param"); - expect(response).toEqual("string"); - }); - - test("getWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithInlinePath({ - param: "param", - }); - expect(response).toEqual("string"); - }); - - test("getWithQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithAllowMultipleQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithPathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithPathAndQuery("param", { - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("getWithInlinePathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("modifyWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithPath("param", "string"); - expect(response).toEqual("string"); - }); - - test("modifyWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string", - }); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts deleted file mode 100644 index 650fc620bb1d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PrimitiveClient", () => { - test("getAndReturnString", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .post("/primitive/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnString("string"); - expect(response).toEqual("string"); - }); - - test("getAndReturnInt", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1; - const rawResponseBody = 1; - server - .mockEndpoint() - .post("/primitive/integer") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnInt(1); - expect(response).toEqual(1); - }); - - test("getAndReturnLong", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1000000; - const rawResponseBody = 1000000; - server - .mockEndpoint() - .post("/primitive/long") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnLong(1000000); - expect(response).toEqual(1000000); - }); - - test("getAndReturnDouble", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1.1; - const rawResponseBody = 1.1; - server - .mockEndpoint() - .post("/primitive/double") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDouble(1.1); - expect(response).toEqual(1.1); - }); - - test("getAndReturnBool", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = true; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/primitive/boolean") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBool(true); - expect(response).toEqual(true); - }); - - test("getAndReturnDatetime", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2024-01-15T09:30:00Z"; - const rawResponseBody = "2024-01-15T09:30:00Z"; - server - .mockEndpoint() - .post("/primitive/datetime") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); - }); - - test("getAndReturnDate", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2023-01-15"; - const rawResponseBody = "2023-01-15"; - server - .mockEndpoint() - .post("/primitive/date") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - expect(response).toEqual("2023-01-15"); - }); - - test("getAndReturnUUID", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - server - .mockEndpoint() - .post("/primitive/uuid") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - }); - - test("getAndReturnBase64", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SGVsbG8gd29ybGQh"; - const rawResponseBody = "SGVsbG8gd29ybGQh"; - server - .mockEndpoint() - .post("/primitive/base64") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - expect(response).toEqual("SGVsbG8gd29ybGQh"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts deleted file mode 100644 index 1481521d77b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PutClient", () => { - test("add", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - errors: [ - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - ], - }; - server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.put.add({ - id: "id", - }); - expect(response).toEqual({ - errors: [ - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - ], - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts deleted file mode 100644 index 35b1405e89ca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UnionClient", () => { - test("getAndReturnUnion", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; - const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; - server - .mockEndpoint() - .post("/union") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - expect(response).toEqual({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts deleted file mode 100644 index b450fbeea217..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UrlsClient", () => { - test("withMixedCase", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.urls.withMixedCase(); - expect(response).toEqual("string"); - }); - - test("noEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/no-ending-slash") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.noEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with-ending-slash/") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withUnderscores", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with_underscores") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withUnderscores(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts deleted file mode 100644 index 61b5a64bce8f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts +++ /dev/null @@ -1,150 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("InlinedRequestsClient", () => { - test("postWithObjectBodyandResponse (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithObjectBodyandResponse (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts deleted file mode 100644 index 3317cf1a69d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoAuthClient", () => { - test("postWithNoAuth (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.noAuth.postWithNoAuth({ - key: "value", - }); - expect(response).toEqual(true); - }); - - test("postWithNoAuth (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.noAuth.postWithNoAuth({ - key: "value", - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts deleted file mode 100644 index 8f5f6a59a512..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoReqBodyClient", () => { - test("getWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.getWithNoRequestBody(); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.postWithNoRequestBody(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts deleted file mode 100644 index a128d4844ba2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("ReqWithHeadersClient", () => { - test("getWithCustomHeader", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - - server - .mockEndpoint() - .post("/test-headers/custom-header") - .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") - .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .build(); - - const response = await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json deleted file mode 100644 index d7627675de20..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "extendedDiagnostics": true, - "strict": true, - "target": "ES6", - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "dist", - "rootDir": "src", - "baseUrl": "src", - "isolatedModules": true, - "isolatedDeclarations": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json deleted file mode 100644 index 5c11446f5984..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "dist/cjs" - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json deleted file mode 100644 index 6ce909748b2c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "esnext", - "outDir": "dist/esm", - "verbatimModuleSyntax": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json deleted file mode 100644 index d77fdf00d259..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.cjs.json" -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts deleted file mode 100644 index ba2ec4f9d45a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from "vitest/config"; -export default defineConfig({ - test: { - projects: [ - { - test: { - globals: true, - name: "unit", - environment: "node", - root: "./tests", - include: ["**/*.test.{js,ts,jsx,tsx}"], - exclude: ["wire/**"], - setupFiles: ["./setup.ts"], - }, - }, - { - test: { - globals: true, - name: "wire", - environment: "node", - root: "./tests/wire", - setupFiles: ["../setup.ts", "../mock-server/setup.ts"], - }, - }, - ], - passWithNoTests: true, - }, -}); From 6885794759b7625da09a65c4e973439b44bd693e Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 03:24:38 -0500 Subject: [PATCH 56/71] fixed docs --- .../cli/src/custom-config/schema/ExpressCustomConfigSchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts b/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts index ee60a5662132..a9e687ee3ad7 100644 --- a/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts +++ b/generators/typescript/express/cli/src/custom-config/schema/ExpressCustomConfigSchema.ts @@ -2,7 +2,7 @@ import { z } from "zod"; /** * Serialization format options: - * - "default": Use Zurg (bundled runtime) - same as legacy behavior + * - "zurg": Use Zurg (bundled runtime) - same as legacy behavior * - "zod": Use Zod as npm dependency * - "none": No serialization layer - same as noSerdeLayer: true */ From a2140d03551e97f9fd5d455a2bb386e12c51a6ca Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 03:26:44 -0500 Subject: [PATCH 57/71] updated type --- .../typescript/express/generator/src/ExpressGenerator.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generators/typescript/express/generator/src/ExpressGenerator.ts b/generators/typescript/express/generator/src/ExpressGenerator.ts index 46b6fbb2d08b..a7a4e5c6339f 100644 --- a/generators/typescript/express/generator/src/ExpressGenerator.ts +++ b/generators/typescript/express/generator/src/ExpressGenerator.ts @@ -11,6 +11,7 @@ import { ImportsManager, NpmPackage, PackageId, + SerializationFormatType, SimpleTypescriptProject, TypescriptProject } from "@fern-typescript/commons"; @@ -59,7 +60,7 @@ export declare namespace ExpressGenerator { includeOtherInUnionTypes: boolean; treatUnknownAsAny: boolean; includeSerdeLayer: boolean; - serializationFormat: "zurg" | "zod" | "none"; + serializationFormat: SerializationFormatType; outputEsm: boolean; retainOriginalCasing: boolean; allowExtraFields: boolean; From 9f6a5b8146ecc28008d36f4073519bbd972e84e0 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 03:35:35 -0500 Subject: [PATCH 58/71] reverted change to config path --- generators/typescript/express/generator/src/ExpressGenerator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/express/generator/src/ExpressGenerator.ts b/generators/typescript/express/generator/src/ExpressGenerator.ts index a7a4e5c6339f..12f3526fbe09 100644 --- a/generators/typescript/express/generator/src/ExpressGenerator.ts +++ b/generators/typescript/express/generator/src/ExpressGenerator.ts @@ -528,7 +528,7 @@ export class ExpressGenerator { this.context.logger.debug(`Generating ${filepathStr}`); const sourceFile = this.rootDirectory.createSourceFile(filepathStr); - const importsManager = new ImportsManager({ packagePath: this.getRelativePackagePath() }); + const importsManager = new ImportsManager({ packagePath: this.config.packagePath }); run({ sourceFile, importsManager }); From 4552c68f04eba3164f704653134bf28883e4fc40 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 03:40:51 -0500 Subject: [PATCH 59/71] replaced with type --- generators/typescript/sdk/generator/src/SdkGenerator.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generators/typescript/sdk/generator/src/SdkGenerator.ts b/generators/typescript/sdk/generator/src/SdkGenerator.ts index 7fbde16239bb..6798ed2635cc 100644 --- a/generators/typescript/sdk/generator/src/SdkGenerator.ts +++ b/generators/typescript/sdk/generator/src/SdkGenerator.ts @@ -27,6 +27,7 @@ import { NpmPackage, PackageId, PublicExportsManager, + SerializationFormatType, SimpleTypescriptProject, TypescriptProject } from "@fern-typescript/commons"; @@ -124,7 +125,7 @@ export declare namespace SdkGenerator { treatUnknownAsAny: boolean; includeContentHeadersOnFileDownloadResponse: boolean; includeSerdeLayer: boolean; - serializationFormat: "zurg" | "zod" | "none"; + serializationFormat: SerializationFormatType; noOptionalProperties: boolean; tolerateRepublish: boolean; retainOriginalCasing: boolean; From b89c0201672eb858c5581d81010ba590cc61f3bc Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 03:57:11 -0500 Subject: [PATCH 60/71] Reverted some changes to zurg format to keep generated code consistent --- .../formats/ZurgFormat.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index 9432d9f9f087..cbb244664e09 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -42,12 +42,15 @@ interface ZurgBaseSchema extends Schema { } /** - * Helper to create a property access expression like `serialization.string()`. + * Helper to create a property access expression like `core.serialization.string()`. */ function createSerializationCall(methodName: string, args: ts.Expression[] = []): ts.Expression { return ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( - ts.factory.createIdentifier("serialization"), + ts.factory.createPropertyAccessExpression( + ts.factory.createIdentifier("core"), + ts.factory.createIdentifier("serialization") + ), ts.factory.createIdentifier(methodName) ), undefined, @@ -83,11 +86,11 @@ export class ZurgFormat implements SerializationFormat { } /** - * Ensure the serialization import is added to the current file + * Ensure the core import is added to the current file */ private ensureSerializationImport(): void { if (!this.hasAddedSerializationImport && this.importsManager) { - this.importsManager.addImportFromRoot("core/schemas", { namespaceImport: "serialization" }); + this.importsManager.addImportFromRoot("core", { namespaceImport: "core" }); this.hasAddedSerializationImport = true; } } @@ -736,7 +739,10 @@ export class ZurgFormat implements SerializationFormat { _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { this.ensureSerializationImport(); return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName(ts.factory.createIdentifier("serialization"), "Schema"), + ts.factory.createQualifiedName( + ts.factory.createQualifiedName(ts.factory.createIdentifier("core"), "serialization"), + "Schema" + ), [rawShape, parsedShape] ); }, @@ -819,7 +825,10 @@ export class ZurgFormat implements SerializationFormat { _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { this.ensureSerializationImport(); return ts.factory.createTypeReferenceNode( - ts.factory.createQualifiedName(ts.factory.createIdentifier("serialization"), "ObjectSchema"), + ts.factory.createQualifiedName( + ts.factory.createQualifiedName(ts.factory.createIdentifier("core"), "serialization"), + "ObjectSchema" + ), [rawShape, parsedShape] ); } From b3d429a915194c40c259c0cf5b1c9f470276c184 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 04:21:32 -0500 Subject: [PATCH 61/71] generated seed files --- .../client/getAndReturnListOfObjects.ts | 10 +++--- .../client/getAndReturnListOfPrimitives.ts | 10 +++--- .../client/getAndReturnMapOfPrimToObject.ts | 10 +++--- .../client/getAndReturnMapPrimToPrim.ts | 10 +++--- .../container/client/getAndReturnOptional.ts | 6 ++-- .../client/getAndReturnSetOfObjects.ts | 10 +++--- .../client/getAndReturnSetOfPrimitives.ts | 10 +++--- .../httpMethods/client/testDelete.ts | 6 ++-- .../resources/httpMethods/client/testGet.ts | 6 ++-- ...tAndReturnNestedWithRequiredFieldAsList.ts | 6 ++-- .../params/client/getWithInlinePath.ts | 6 ++-- .../resources/params/client/getWithPath.ts | 6 ++-- .../params/client/modifyWithInlinePath.ts | 12 ++++--- .../resources/params/client/modifyWithPath.ts | 10 +++--- .../primitive/client/getAndReturnBase64.ts | 14 +++++--- .../primitive/client/getAndReturnBool.ts | 12 ++++--- .../primitive/client/getAndReturnDate.ts | 12 ++++--- .../primitive/client/getAndReturnDatetime.ts | 14 +++++--- .../primitive/client/getAndReturnDouble.ts | 14 +++++--- .../primitive/client/getAndReturnInt.ts | 10 +++--- .../primitive/client/getAndReturnLong.ts | 12 ++++--- .../primitive/client/getAndReturnString.ts | 14 +++++--- .../primitive/client/getAndReturnUuid.ts | 12 ++++--- .../resources/put/types/ErrorCategory.ts | 6 ++-- .../resources/put/types/ErrorCode.ts | 32 ++++++++++--------- .../endpoints/resources/put/types/Error_.ts | 18 ++++++----- .../resources/put/types/PutResponse.ts | 8 ++--- .../resources/urls/client/noEndingSlash.ts | 6 ++-- .../resources/urls/client/withEndingSlash.ts | 6 ++-- .../resources/urls/client/withMixedCase.ts | 6 ++-- .../resources/urls/client/withUnderscores.ts | 6 ++-- .../types/BadObjectRequestInfo.ts | 8 ++--- .../client/requests/PostWithObjectBody.ts | 12 +++---- .../resources/noAuth/client/postWithNoAuth.ts | 6 ++-- .../noReqBody/client/postWithNoRequestBody.ts | 6 ++-- .../client/getWithCustomHeader.ts | 6 ++-- .../resources/docs/types/ObjectWithDocs.ts | 8 ++--- .../resources/enum/types/WeatherReport.ts | 6 ++-- .../resources/object/types/DoubleOptional.ts | 6 ++-- .../types/NestedObjectWithOptionalField.ts | 10 +++--- .../types/NestedObjectWithRequiredField.ts | 10 +++--- .../object/types/ObjectWithMapOfMap.ts | 12 +++---- .../object/types/ObjectWithOptionalField.ts | 32 +++++++++---------- .../object/types/ObjectWithRequiredField.ts | 8 ++--- .../resources/object/types/OptionalAlias.ts | 6 ++-- .../types/resources/union/types/Animal.ts | 21 ++++++------ .../types/resources/union/types/Cat.ts | 10 +++--- .../types/resources/union/types/Dog.ts | 10 +++--- .../client/getAndReturnListOfObjects.ts | 10 +++--- .../client/getAndReturnListOfPrimitives.ts | 10 +++--- .../client/getAndReturnMapOfPrimToObject.ts | 10 +++--- .../client/getAndReturnMapPrimToPrim.ts | 10 +++--- .../container/client/getAndReturnOptional.ts | 6 ++-- .../client/getAndReturnSetOfObjects.ts | 10 +++--- .../client/getAndReturnSetOfPrimitives.ts | 10 +++--- .../httpMethods/client/testDelete.ts | 6 ++-- .../resources/httpMethods/client/testGet.ts | 6 ++-- ...tAndReturnNestedWithRequiredFieldAsList.ts | 6 ++-- .../params/client/getWithInlinePath.ts | 6 ++-- .../resources/params/client/getWithPath.ts | 6 ++-- .../params/client/modifyWithInlinePath.ts | 12 ++++--- .../resources/params/client/modifyWithPath.ts | 10 +++--- .../primitive/client/getAndReturnBase64.ts | 14 +++++--- .../primitive/client/getAndReturnBool.ts | 12 ++++--- .../primitive/client/getAndReturnDate.ts | 12 ++++--- .../primitive/client/getAndReturnDatetime.ts | 14 +++++--- .../primitive/client/getAndReturnDouble.ts | 14 +++++--- .../primitive/client/getAndReturnInt.ts | 10 +++--- .../primitive/client/getAndReturnLong.ts | 12 ++++--- .../primitive/client/getAndReturnString.ts | 14 +++++--- .../primitive/client/getAndReturnUuid.ts | 12 ++++--- .../resources/put/types/ErrorCategory.ts | 6 ++-- .../resources/put/types/ErrorCode.ts | 32 ++++++++++--------- .../endpoints/resources/put/types/Error_.ts | 18 ++++++----- .../resources/put/types/PutResponse.ts | 8 ++--- .../resources/urls/client/noEndingSlash.ts | 6 ++-- .../resources/urls/client/withEndingSlash.ts | 6 ++-- .../resources/urls/client/withMixedCase.ts | 6 ++-- .../resources/urls/client/withUnderscores.ts | 6 ++-- .../types/BadObjectRequestInfo.ts | 8 ++--- .../client/requests/PostWithObjectBody.ts | 12 +++---- .../resources/noAuth/client/postWithNoAuth.ts | 6 ++-- .../noReqBody/client/postWithNoRequestBody.ts | 6 ++-- .../client/getWithCustomHeader.ts | 6 ++-- .../resources/docs/types/ObjectWithDocs.ts | 8 ++--- .../resources/enum/types/WeatherReport.ts | 6 ++-- .../resources/object/types/DoubleOptional.ts | 6 ++-- .../types/NestedObjectWithOptionalField.ts | 10 +++--- .../types/NestedObjectWithRequiredField.ts | 10 +++--- .../object/types/ObjectWithMapOfMap.ts | 12 +++---- .../object/types/ObjectWithOptionalField.ts | 32 +++++++++---------- .../object/types/ObjectWithRequiredField.ts | 8 ++--- .../resources/object/types/OptionalAlias.ts | 6 ++-- .../types/resources/union/types/Animal.ts | 21 ++++++------ .../types/resources/union/types/Cat.ts | 10 +++--- .../types/resources/union/types/Dog.ts | 10 +++--- 96 files changed, 528 insertions(+), 466 deletions(-) diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts index 4866a9d8d770..e37f244ea60c 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts index adb39e17c39b..668b72ec3402 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, string[] -> = serialization.list(serialization.string()); +> = core.serialization.list(core.serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, string[] -> = serialization.list(serialization.string()); +> = core.serialization.list(core.serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts index 25acdb82fb28..242978c11a34 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, Record -> = serialization.record(serialization.string(), ObjectWithRequiredField); +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); export declare namespace Request { export type Raw = Record; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, Record -> = serialization.record(serialization.string(), ObjectWithRequiredField); +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts index 798054261d42..9003c1ac3676 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, Record -> = serialization.record(serialization.string(), serialization.string()); +> = core.serialization.record(core.serialization.string(), core.serialization.string()); export declare namespace Request { export type Raw = Record; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, Record -> = serialization.record(serialization.string(), serialization.string()); +> = core.serialization.record(core.serialization.string(), core.serialization.string()); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts index aba0ab439f6d..b7e20374f571 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -1,11 +1,11 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serialization from "../../../../../../core/schemas/index.js"; +import type * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); @@ -14,7 +14,7 @@ export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw | null | undefined; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts index f8a7f9ea7545..4792425484f1 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts index 5ad5cb13eddf..53931f5e393e 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, Set -> = serialization.set(serialization.string()); +> = core.serialization.set(core.serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, Set -> = serialization.set(serialization.string()); +> = core.serialization.set(core.serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts index 8322487928fc..b6273278aa1f 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.boolean(); +export const Response: core.serialization.Schema = + core.serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts index 56a70eed1b68..a642aa120d8b 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts index a075c14e0cf7..60f40db3f33b 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, SeedExhaustive.types.NestedObjectWithRequiredField[] -> = serialization.list(NestedObjectWithRequiredField); +> = core.serialization.list(NestedObjectWithRequiredField); export declare namespace Request { export type Raw = NestedObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts index 9a2139917311..c82dda746e5a 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts index b620a7ba796a..da8888318c5b 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts index 85205c392705..b84b3f790f22 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.params.modifyWithInlinePath.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts index c7784b75b36c..8369d9dae207 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts index 0900f791e8c9..eb7fdb1065fb 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, + string +> = core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts index 6fb2f3a6385a..f51fb5f9e891 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.boolean(); +export const Request: core.serialization.Schema = + core.serialization.boolean(); export declare namespace Request { export type Raw = boolean; } -export const Response: serialization.Schema = - serialization.boolean(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBool.Response.Raw, + boolean +> = core.serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts index c1ba4ac07088..08ac416d1caf 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDate.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts index a0f8e8d67e2f..a80c46b7f418 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.date(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, + Date +> = core.serialization.date(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.date(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, + Date +> = core.serialization.date(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts index 39fad02041dc..bba9c504ff71 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.number(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, + number +> = core.serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: serialization.Schema = - serialization.number(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, + number +> = core.serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts index 52a29cbb7b23..552fe3843ef9 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.number(); +export const Request: core.serialization.Schema = + core.serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: serialization.Schema = - serialization.number(); +export const Response: core.serialization.Schema = + core.serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts index 4cd44616f168..13a86da3b2b5 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.bigint(); +export const Request: core.serialization.Schema = + core.serialization.bigint(); export declare namespace Request { export type Raw = bigint | number; } -export const Response: serialization.Schema = - serialization.bigint(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnLong.Response.Raw, + bigint +> = core.serialization.bigint(); export declare namespace Response { export type Raw = bigint | number; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts index 230f9bfc7f6e..f75bf59ba909 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Request.Raw, + string +> = core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts index e11f5ffe387f..64875010a017 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts index c1a5d0978baf..47e249372cff 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCategory: serialization.Schema< +export const ErrorCategory: core.serialization.Schema< serializers.endpoints.ErrorCategory.Raw, SeedExhaustive.endpoints.ErrorCategory -> = serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); export declare namespace ErrorCategory { export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts index b8a7dbb5a29b..a36b10d4b362 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -1,23 +1,25 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCode: serialization.Schema = - serialization.enum_([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", - ]); +export const ErrorCode: core.serialization.Schema< + serializers.endpoints.ErrorCode.Raw, + SeedExhaustive.endpoints.ErrorCode +> = core.serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); export declare namespace ErrorCode { export type Raw = diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts index 1f0e2699482d..59ab664d43a2 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -1,18 +1,20 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ErrorCategory } from "./ErrorCategory.js"; import { ErrorCode } from "./ErrorCode.js"; -export const Error_: serialization.ObjectSchema = - serialization.object({ - category: ErrorCategory, - code: ErrorCode, - detail: serialization.string().optional(), - field: serialization.string().optional(), - }); +export const Error_: core.serialization.ObjectSchema< + serializers.endpoints.Error_.Raw, + SeedExhaustive.endpoints.Error_ +> = core.serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: core.serialization.string().optional(), + field: core.serialization.string().optional(), +}); export declare namespace Error_ { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts index 7b07487770da..17af0986c151 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -1,15 +1,15 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { Error_ } from "./Error_.js"; -export const PutResponse: serialization.ObjectSchema< +export const PutResponse: core.serialization.ObjectSchema< serializers.endpoints.PutResponse.Raw, SeedExhaustive.endpoints.PutResponse -> = serialization.object({ - errors: serialization.list(Error_).optional(), +> = core.serialization.object({ + errors: core.serialization.list(Error_).optional(), }); export declare namespace PutResponse { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts index e3b901d01021..2b0a2cfbfa53 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts index 4db7cfd2be32..de39ec7a2a0d 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts index 34921f105169..ffedf860047a 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts index 2d83f47ca591..8d308fd3e42f 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts index dc034215328d..5d81697cccfb 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../api/index.js"; -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const BadObjectRequestInfo: serialization.ObjectSchema< +export const BadObjectRequestInfo: core.serialization.ObjectSchema< serializers.BadObjectRequestInfo.Raw, SeedExhaustive.BadObjectRequestInfo -> = serialization.object({ - message: serialization.string(), +> = core.serialization.object({ + message: core.serialization.string(), }); export declare namespace BadObjectRequestInfo { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts index 7b4d13692e91..d8c20c33277a 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../api/index.js"; -import * as serialization from "../../../../../core/schemas/index.js"; +import * as core from "../../../../../core/index.js"; import type * as serializers from "../../../../index.js"; import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; -export const PostWithObjectBody: serialization.Schema< +export const PostWithObjectBody: core.serialization.Schema< serializers.PostWithObjectBody.Raw, SeedExhaustive.PostWithObjectBody -> = serialization.object({ - string: serialization.string(), - integer: serialization.number(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), +> = core.serialization.object({ + string: core.serialization.string(), + integer: core.serialization.number(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace PostWithObjectBody { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts index f7612cea2aaf..8e7617816edf 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const Response: serialization.Schema = - serialization.boolean(); +export const Response: core.serialization.Schema = + core.serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts index 1e6dd32ad43e..c0cba3668202 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts index 757092ecd703..70ac5077c6f2 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts index 84741ea03b10..ab35ed9023bd 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithDocs: serialization.ObjectSchema< +export const ObjectWithDocs: core.serialization.ObjectSchema< serializers.types.ObjectWithDocs.Raw, SeedExhaustive.types.ObjectWithDocs -> = serialization.object({ - string: serialization.string(), +> = core.serialization.object({ + string: core.serialization.string(), }); export declare namespace ObjectWithDocs { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts index e2ef4f8b1761..96a37eda2a46 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const WeatherReport: serialization.Schema< +export const WeatherReport: core.serialization.Schema< serializers.types.WeatherReport.Raw, SeedExhaustive.types.WeatherReport -> = serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); export declare namespace WeatherReport { export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts index 9abd1d7694aa..e8e0fd387243 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { OptionalAlias } from "./OptionalAlias.js"; -export const DoubleOptional: serialization.ObjectSchema< +export const DoubleOptional: core.serialization.ObjectSchema< serializers.types.DoubleOptional.Raw, SeedExhaustive.types.DoubleOptional -> = serialization.object({ +> = core.serialization.object({ optionalAlias: OptionalAlias.optional(), }); diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts index 60110017a1f0..c754d9aba654 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithOptionalField: serialization.ObjectSchema< +export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< serializers.types.NestedObjectWithOptionalField.Raw, SeedExhaustive.types.NestedObjectWithOptionalField -> = serialization.object({ - string: serialization.string().optional(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField.optional()), +> = core.serialization.object({ + string: core.serialization.string().optional(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), }); export declare namespace NestedObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts index d80cf48ee660..cd443843bf86 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithRequiredField: serialization.ObjectSchema< +export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< serializers.types.NestedObjectWithRequiredField.Raw, SeedExhaustive.types.NestedObjectWithRequiredField -> = serialization.object({ - string: serialization.string(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), +> = core.serialization.object({ + string: core.serialization.string(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace NestedObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts index 04267ee70c58..c7426a9b9847 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithMapOfMap: serialization.ObjectSchema< +export const ObjectWithMapOfMap: core.serialization.ObjectSchema< serializers.types.ObjectWithMapOfMap.Raw, SeedExhaustive.types.ObjectWithMapOfMap -> = serialization.object({ - map: serialization.record( - serialization.string(), - serialization.record(serialization.string(), serialization.string()), +> = core.serialization.object({ + map: core.serialization.record( + core.serialization.string(), + core.serialization.record(core.serialization.string(), core.serialization.string()), ), }); diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts index 75b99bda2038..c68f47152475 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -1,26 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithOptionalField: serialization.ObjectSchema< +export const ObjectWithOptionalField: core.serialization.ObjectSchema< serializers.types.ObjectWithOptionalField.Raw, SeedExhaustive.types.ObjectWithOptionalField -> = serialization.object({ - string: serialization.string().optional(), - integer: serialization.number().optional(), - long: serialization.bigint().optional(), - double: serialization.number().optional(), - bool: serialization.boolean().optional(), - datetime: serialization.date().optional(), - date: serialization.string().optional(), - uuid: serialization.string().optional(), - base64: serialization.string().optional(), - list: serialization.list(serialization.string()).optional(), - set: serialization.set(serialization.string()).optional(), - map: serialization.record(serialization.number(), serialization.string()).optional(), - bigint: serialization.bigint().optional(), +> = core.serialization.object({ + string: core.serialization.string().optional(), + integer: core.serialization.number().optional(), + long: core.serialization.bigint().optional(), + double: core.serialization.number().optional(), + bool: core.serialization.boolean().optional(), + datetime: core.serialization.date().optional(), + date: core.serialization.string().optional(), + uuid: core.serialization.string().optional(), + base64: core.serialization.string().optional(), + list: core.serialization.list(core.serialization.string()).optional(), + set: core.serialization.set(core.serialization.string()).optional(), + map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), + bigint: core.serialization.bigint().optional(), }); export declare namespace ObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts index ca11412dccbb..b6887e41337d 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithRequiredField: serialization.ObjectSchema< +export const ObjectWithRequiredField: core.serialization.ObjectSchema< serializers.types.ObjectWithRequiredField.Raw, SeedExhaustive.types.ObjectWithRequiredField -> = serialization.object({ - string: serialization.string(), +> = core.serialization.object({ + string: core.serialization.string(), }); export declare namespace ObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts index d684396d649e..a7798d5904bf 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const OptionalAlias: serialization.Schema< +export const OptionalAlias: core.serialization.Schema< serializers.types.OptionalAlias.Raw, SeedExhaustive.types.OptionalAlias -> = serialization.string().optional(); +> = core.serialization.string().optional(); export declare namespace OptionalAlias { export type Raw = string | null | undefined; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts index 8b7ba0c9d0ae..83b27d0bb69d 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts @@ -1,20 +1,21 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { Cat } from "./Cat.js"; import { Dog } from "./Dog.js"; -export const Animal: serialization.Schema = serialization - .union("animal", { - dog: Dog, - cat: Cat, - }) - .transform({ - transform: (value) => value, - untransform: (value) => value, - }); +export const Animal: core.serialization.Schema = + core.serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); export declare namespace Animal { export type Raw = Animal.Dog | Animal.Cat; diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts index c040be8e6aed..16f8a2006e5c 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Cat: serialization.ObjectSchema = - serialization.object({ - name: serialization.string(), - likesToMeow: serialization.boolean(), +export const Cat: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToMeow: core.serialization.boolean(), }); export declare namespace Cat { diff --git a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts index 5f6f040b3331..271a1f3a4afa 100644 --- a/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts +++ b/seed/ts-sdk/exhaustive/bigint-serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Dog: serialization.ObjectSchema = - serialization.object({ - name: serialization.string(), - likesToWoof: serialization.boolean(), +export const Dog: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToWoof: core.serialization.boolean(), }); export declare namespace Dog { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts index 4866a9d8d770..e37f244ea60c 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts index adb39e17c39b..668b72ec3402 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, string[] -> = serialization.list(serialization.string()); +> = core.serialization.list(core.serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, string[] -> = serialization.list(serialization.string()); +> = core.serialization.list(core.serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts index 25acdb82fb28..242978c11a34 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, Record -> = serialization.record(serialization.string(), ObjectWithRequiredField); +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); export declare namespace Request { export type Raw = Record; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, Record -> = serialization.record(serialization.string(), ObjectWithRequiredField); +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts index 798054261d42..9003c1ac3676 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, Record -> = serialization.record(serialization.string(), serialization.string()); +> = core.serialization.record(core.serialization.string(), core.serialization.string()); export declare namespace Request { export type Raw = Record; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, Record -> = serialization.record(serialization.string(), serialization.string()); +> = core.serialization.record(core.serialization.string(), core.serialization.string()); export declare namespace Response { export type Raw = Record; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts index aba0ab439f6d..b7e20374f571 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -1,11 +1,11 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serialization from "../../../../../../core/schemas/index.js"; +import type * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); @@ -14,7 +14,7 @@ export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw | null | undefined; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnOptional.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField | undefined > = ObjectWithRequiredField.optional(); diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts index f8a7f9ea7545..4792425484f1 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -1,23 +1,23 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Request { export type Raw = ObjectWithRequiredField.Raw[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, SeedExhaustive.types.ObjectWithRequiredField[] -> = serialization.list(ObjectWithRequiredField); +> = core.serialization.list(ObjectWithRequiredField); export declare namespace Response { export type Raw = ObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts index 5ad5cb13eddf..53931f5e393e 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -1,21 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, Set -> = serialization.set(serialization.string()); +> = core.serialization.set(core.serialization.string()); export declare namespace Request { export type Raw = string[]; } -export const Response: serialization.Schema< +export const Response: core.serialization.Schema< serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, Set -> = serialization.set(serialization.string()); +> = core.serialization.set(core.serialization.string()); export declare namespace Response { export type Raw = string[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts index 8322487928fc..b6273278aa1f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.boolean(); +export const Response: core.serialization.Schema = + core.serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts index 56a70eed1b68..a642aa120d8b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts index a075c14e0cf7..60f40db3f33b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; -export const Request: serialization.Schema< +export const Request: core.serialization.Schema< serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, SeedExhaustive.types.NestedObjectWithRequiredField[] -> = serialization.list(NestedObjectWithRequiredField); +> = core.serialization.list(NestedObjectWithRequiredField); export declare namespace Request { export type Raw = NestedObjectWithRequiredField.Raw[]; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts index 9a2139917311..c82dda746e5a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts index b620a7ba796a..da8888318c5b 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts index 85205c392705..b84b3f790f22 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.params.modifyWithInlinePath.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts index c7784b75b36c..8369d9dae207 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts index 0900f791e8c9..eb7fdb1065fb 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, + string +> = core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts index 6fb2f3a6385a..f51fb5f9e891 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.boolean(); +export const Request: core.serialization.Schema = + core.serialization.boolean(); export declare namespace Request { export type Raw = boolean; } -export const Response: serialization.Schema = - serialization.boolean(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBool.Response.Raw, + boolean +> = core.serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts index c1ba4ac07088..08ac416d1caf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDate.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts index a0f8e8d67e2f..a80c46b7f418 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.date(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, + Date +> = core.serialization.date(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.date(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, + Date +> = core.serialization.date(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts index 39fad02041dc..bba9c504ff71 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.number(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, + number +> = core.serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: serialization.Schema = - serialization.number(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, + number +> = core.serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts index 52a29cbb7b23..552fe3843ef9 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.number(); +export const Request: core.serialization.Schema = + core.serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: serialization.Schema = - serialization.number(); +export const Response: core.serialization.Schema = + core.serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts index 8de6541f8cbf..191eda735e47 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.number(); +export const Request: core.serialization.Schema = + core.serialization.number(); export declare namespace Request { export type Raw = number; } -export const Response: serialization.Schema = - serialization.number(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnLong.Response.Raw, + number +> = core.serialization.number(); export declare namespace Response { export type Raw = number; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts index 230f9bfc7f6e..f75bf59ba909 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -1,17 +1,21 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Request.Raw, + string +> = core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts index e11f5ffe387f..64875010a017 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -1,17 +1,19 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; } -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, + string +> = core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts index c1a5d0978baf..47e249372cff 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCategory: serialization.Schema< +export const ErrorCategory: core.serialization.Schema< serializers.endpoints.ErrorCategory.Raw, SeedExhaustive.endpoints.ErrorCategory -> = serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); export declare namespace ErrorCategory { export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts index b8a7dbb5a29b..a36b10d4b362 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -1,23 +1,25 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ErrorCode: serialization.Schema = - serialization.enum_([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", - ]); +export const ErrorCode: core.serialization.Schema< + serializers.endpoints.ErrorCode.Raw, + SeedExhaustive.endpoints.ErrorCode +> = core.serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); export declare namespace ErrorCode { export type Raw = diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts index 1f0e2699482d..59ab664d43a2 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -1,18 +1,20 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ErrorCategory } from "./ErrorCategory.js"; import { ErrorCode } from "./ErrorCode.js"; -export const Error_: serialization.ObjectSchema = - serialization.object({ - category: ErrorCategory, - code: ErrorCode, - detail: serialization.string().optional(), - field: serialization.string().optional(), - }); +export const Error_: core.serialization.ObjectSchema< + serializers.endpoints.Error_.Raw, + SeedExhaustive.endpoints.Error_ +> = core.serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: core.serialization.string().optional(), + field: core.serialization.string().optional(), +}); export declare namespace Error_ { export interface Raw { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts index 7b07487770da..17af0986c151 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -1,15 +1,15 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { Error_ } from "./Error_.js"; -export const PutResponse: serialization.ObjectSchema< +export const PutResponse: core.serialization.ObjectSchema< serializers.endpoints.PutResponse.Raw, SeedExhaustive.endpoints.PutResponse -> = serialization.object({ - errors: serialization.list(Error_).optional(), +> = core.serialization.object({ + errors: core.serialization.list(Error_).optional(), }); export declare namespace PutResponse { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts index e3b901d01021..2b0a2cfbfa53 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts index 4db7cfd2be32..de39ec7a2a0d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts index 34921f105169..ffedf860047a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts index 2d83f47ca591..8d308fd3e42f 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts index dc034215328d..5d81697cccfb 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../api/index.js"; -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const BadObjectRequestInfo: serialization.ObjectSchema< +export const BadObjectRequestInfo: core.serialization.ObjectSchema< serializers.BadObjectRequestInfo.Raw, SeedExhaustive.BadObjectRequestInfo -> = serialization.object({ - message: serialization.string(), +> = core.serialization.object({ + message: core.serialization.string(), }); export declare namespace BadObjectRequestInfo { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts index 7b4d13692e91..d8c20c33277a 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -1,17 +1,17 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../api/index.js"; -import * as serialization from "../../../../../core/schemas/index.js"; +import * as core from "../../../../../core/index.js"; import type * as serializers from "../../../../index.js"; import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; -export const PostWithObjectBody: serialization.Schema< +export const PostWithObjectBody: core.serialization.Schema< serializers.PostWithObjectBody.Raw, SeedExhaustive.PostWithObjectBody -> = serialization.object({ - string: serialization.string(), - integer: serialization.number(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), +> = core.serialization.object({ + string: core.serialization.string(), + integer: core.serialization.number(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace PostWithObjectBody { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts index f7612cea2aaf..8e7617816edf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const Response: serialization.Schema = - serialization.boolean(); +export const Response: core.serialization.Schema = + core.serialization.boolean(); export declare namespace Response { export type Raw = boolean; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts index 1e6dd32ad43e..c0cba3668202 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const Response: serialization.Schema = - serialization.string(); +export const Response: core.serialization.Schema = + core.serialization.string(); export declare namespace Response { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts index 757092ecd703..70ac5077c6f2 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -1,10 +1,10 @@ // This file was auto-generated by Fern from our API Definition. -import * as serialization from "../../../../core/schemas/index.js"; +import * as core from "../../../../core/index.js"; import type * as serializers from "../../../index.js"; -export const Request: serialization.Schema = - serialization.string(); +export const Request: core.serialization.Schema = + core.serialization.string(); export declare namespace Request { export type Raw = string; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts index 84741ea03b10..ab35ed9023bd 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithDocs: serialization.ObjectSchema< +export const ObjectWithDocs: core.serialization.ObjectSchema< serializers.types.ObjectWithDocs.Raw, SeedExhaustive.types.ObjectWithDocs -> = serialization.object({ - string: serialization.string(), +> = core.serialization.object({ + string: core.serialization.string(), }); export declare namespace ObjectWithDocs { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts index e2ef4f8b1761..96a37eda2a46 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const WeatherReport: serialization.Schema< +export const WeatherReport: core.serialization.Schema< serializers.types.WeatherReport.Raw, SeedExhaustive.types.WeatherReport -> = serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); export declare namespace WeatherReport { export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts index 9abd1d7694aa..e8e0fd387243 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { OptionalAlias } from "./OptionalAlias.js"; -export const DoubleOptional: serialization.ObjectSchema< +export const DoubleOptional: core.serialization.ObjectSchema< serializers.types.DoubleOptional.Raw, SeedExhaustive.types.DoubleOptional -> = serialization.object({ +> = core.serialization.object({ optionalAlias: OptionalAlias.optional(), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts index 60110017a1f0..c754d9aba654 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithOptionalField: serialization.ObjectSchema< +export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< serializers.types.NestedObjectWithOptionalField.Raw, SeedExhaustive.types.NestedObjectWithOptionalField -> = serialization.object({ - string: serialization.string().optional(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField.optional()), +> = core.serialization.object({ + string: core.serialization.string().optional(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), }); export declare namespace NestedObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts index d80cf48ee660..cd443843bf86 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; -export const NestedObjectWithRequiredField: serialization.ObjectSchema< +export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< serializers.types.NestedObjectWithRequiredField.Raw, SeedExhaustive.types.NestedObjectWithRequiredField -> = serialization.object({ - string: serialization.string(), - nestedObject: serialization.property("NestedObject", ObjectWithOptionalField), +> = core.serialization.object({ + string: core.serialization.string(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), }); export declare namespace NestedObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts index 04267ee70c58..c7426a9b9847 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -1,16 +1,16 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithMapOfMap: serialization.ObjectSchema< +export const ObjectWithMapOfMap: core.serialization.ObjectSchema< serializers.types.ObjectWithMapOfMap.Raw, SeedExhaustive.types.ObjectWithMapOfMap -> = serialization.object({ - map: serialization.record( - serialization.string(), - serialization.record(serialization.string(), serialization.string()), +> = core.serialization.object({ + map: core.serialization.record( + core.serialization.string(), + core.serialization.record(core.serialization.string(), core.serialization.string()), ), }); diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts index 462e91e5c8db..44a200707fd8 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -1,26 +1,26 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithOptionalField: serialization.ObjectSchema< +export const ObjectWithOptionalField: core.serialization.ObjectSchema< serializers.types.ObjectWithOptionalField.Raw, SeedExhaustive.types.ObjectWithOptionalField -> = serialization.object({ - string: serialization.string().optional(), - integer: serialization.number().optional(), - long: serialization.number().optional(), - double: serialization.number().optional(), - bool: serialization.boolean().optional(), - datetime: serialization.date().optional(), - date: serialization.string().optional(), - uuid: serialization.string().optional(), - base64: serialization.string().optional(), - list: serialization.list(serialization.string()).optional(), - set: serialization.set(serialization.string()).optional(), - map: serialization.record(serialization.number(), serialization.string()).optional(), - bigint: serialization.string().optional(), +> = core.serialization.object({ + string: core.serialization.string().optional(), + integer: core.serialization.number().optional(), + long: core.serialization.number().optional(), + double: core.serialization.number().optional(), + bool: core.serialization.boolean().optional(), + datetime: core.serialization.date().optional(), + date: core.serialization.string().optional(), + uuid: core.serialization.string().optional(), + base64: core.serialization.string().optional(), + list: core.serialization.list(core.serialization.string()).optional(), + set: core.serialization.set(core.serialization.string()).optional(), + map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), + bigint: core.serialization.string().optional(), }); export declare namespace ObjectWithOptionalField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts index ca11412dccbb..b6887e41337d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -1,14 +1,14 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const ObjectWithRequiredField: serialization.ObjectSchema< +export const ObjectWithRequiredField: core.serialization.ObjectSchema< serializers.types.ObjectWithRequiredField.Raw, SeedExhaustive.types.ObjectWithRequiredField -> = serialization.object({ - string: serialization.string(), +> = core.serialization.object({ + string: core.serialization.string(), }); export declare namespace ObjectWithRequiredField { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts index d684396d649e..a7798d5904bf 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const OptionalAlias: serialization.Schema< +export const OptionalAlias: core.serialization.Schema< serializers.types.OptionalAlias.Raw, SeedExhaustive.types.OptionalAlias -> = serialization.string().optional(); +> = core.serialization.string().optional(); export declare namespace OptionalAlias { export type Raw = string | null | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts index 8b7ba0c9d0ae..83b27d0bb69d 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Animal.ts @@ -1,20 +1,21 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; import { Cat } from "./Cat.js"; import { Dog } from "./Dog.js"; -export const Animal: serialization.Schema = serialization - .union("animal", { - dog: Dog, - cat: Cat, - }) - .transform({ - transform: (value) => value, - untransform: (value) => value, - }); +export const Animal: core.serialization.Schema = + core.serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); export declare namespace Animal { export type Raw = Animal.Dog | Animal.Cat; diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts index c040be8e6aed..16f8a2006e5c 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Cat.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Cat: serialization.ObjectSchema = - serialization.object({ - name: serialization.string(), - likesToMeow: serialization.boolean(), +export const Cat: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToMeow: core.serialization.boolean(), }); export declare namespace Cat { diff --git a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts index 5f6f040b3331..271a1f3a4afa 100644 --- a/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts +++ b/seed/ts-sdk/exhaustive/serde-layer/src/serialization/resources/types/resources/union/types/Dog.ts @@ -1,13 +1,13 @@ // This file was auto-generated by Fern from our API Definition. import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as serialization from "../../../../../../core/schemas/index.js"; +import * as core from "../../../../../../core/index.js"; import type * as serializers from "../../../../../index.js"; -export const Dog: serialization.ObjectSchema = - serialization.object({ - name: serialization.string(), - likesToWoof: serialization.boolean(), +export const Dog: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToWoof: core.serialization.boolean(), }); export declare namespace Dog { From f186607314279a975f0d6d09a3c62ba29d15ef7c Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 04:26:55 -0500 Subject: [PATCH 62/71] used version for zod --- .../utils/commons/src/core-utilities/CoreUtilitiesManager.ts | 4 ++-- .../commons/src/serialization-pipeline/formats/ZodFormat.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts index 3518231555f7..46de8eae286c 100644 --- a/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts +++ b/generators/typescript/utils/commons/src/core-utilities/CoreUtilitiesManager.ts @@ -11,7 +11,7 @@ import { getReferenceToExportViaNamespaceImport } from "../referencing"; import { PassthroughFormat, SerializationFormatType, - SerializationPipeline, + ZOD_VERSION, ZodFormat, ZURG_MANIFEST, ZurgFormat @@ -199,7 +199,7 @@ export class CoreUtilitiesManager { private addSerializationDependencies(dependencyManager: DependencyManager): void { if (this.serializationFormat === "zod") { // Zod uses an npm dependency instead of bundled runtime files - dependencyManager.addDependency("zod", "^3.23.0"); + dependencyManager.addDependency("zod", ZOD_VERSION); } // Zurg and Passthrough formats don't require external npm dependencies } diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 6f134e876487..8a99fd2db936 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -19,7 +19,7 @@ import { * @todo Make this configurable from a client standpoint. This would be complex to implement because it would likely * involve scanning Zod's api at the given version and code-generating based on the results of the scan. */ -const ZOD_VERSION = "^3.23.0"; +export const ZOD_VERSION = "^3.23.0"; /** * Base schema implementation for Zod format From d5138b2430b8c0be38edeaa23e556b67bb58cacd Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 12:13:23 -0500 Subject: [PATCH 63/71] code organization --- .../utils/commons/src/core-utilities/Zurg.ts | 28 +- .../SerializationFormat.ts | 401 +++++++++--------- .../SerializationPipeline.ts | 4 +- .../formats/PassthroughFormat.ts | 74 ++-- .../formats/ZodFormat.ts | 83 ++-- .../formats/ZurgFormat.ts | 111 ++--- .../serialization-pipeline/formats/index.ts | 2 +- .../src/serialization-pipeline/index.ts | 17 +- 8 files changed, 355 insertions(+), 365 deletions(-) diff --git a/generators/typescript/utils/commons/src/core-utilities/Zurg.ts b/generators/typescript/utils/commons/src/core-utilities/Zurg.ts index 2a12af00d725..aa5bf754bae4 100644 --- a/generators/typescript/utils/commons/src/core-utilities/Zurg.ts +++ b/generators/typescript/utils/commons/src/core-utilities/Zurg.ts @@ -1,17 +1,7 @@ -import { - AdditionalProperty, - ObjectLikeSchema, - ObjectSchema, - Property, - SchemaOptions, - SchemaWithUtils, - SerializationFormat, - SingleUnionType, - UnionArgs -} from "../serialization-pipeline/SerializationFormat"; +import { SerializationFormat } from "../serialization-pipeline/SerializationFormat"; // Re-export types from SerializationFormat for backward compatibility -export type { SchemaOptions }; +export type SchemaOptions = SerializationFormat.SchemaOptions; /** * Zurg is now a type alias for SerializationFormat. @@ -24,14 +14,14 @@ export type Zurg = SerializationFormat; * All types are aliased to their SerializationFormat equivalents. */ export declare namespace Zurg { - export { SchemaWithUtils as Schema }; - export { ObjectSchema }; - export { ObjectLikeSchema }; - export { AdditionalProperty }; - export { Property }; + export type Schema = SerializationFormat.SchemaWithUtils; + export type ObjectSchema = SerializationFormat.ObjectSchema; + export type ObjectLikeSchema = SerializationFormat.ObjectLikeSchema; + export type AdditionalProperty = SerializationFormat.AdditionalProperty; + export type Property = SerializationFormat.Property; export namespace union { - export { UnionArgs as Args }; - export { SingleUnionType }; + export type Args = SerializationFormat.UnionArgs; + export type SingleUnionType = SerializationFormat.SingleUnionType; } } diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts index 5f60004de6b7..b24c231b1cdf 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationFormat.ts @@ -3,173 +3,8 @@ import { ts } from "ts-morph"; import { Reference } from "../referencing"; /** - * Options passed to schema parse/json operations - */ -export interface SchemaOptions { - unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; - allowUnrecognizedUnionMembers?: boolean; - allowUnrecognizedEnumValues?: boolean; - skipValidation?: boolean; - omitUndefined?: boolean; - breadcrumbsPrefix?: string[]; -} - -/** - * Base schema interface that all format-specific schemas must implement. - * This represents a schema that can generate TypeScript AST expressions. - */ -export interface Schema { - /** - * Generates the TypeScript AST expression for this schema definition - */ - toExpression: () => ts.Expression; - - /** - * Whether this schema represents an optional value - */ - isOptional: boolean; - - /** - * Whether this schema represents a nullable value - */ - isNullable: boolean; - - /** - * Optional: Generate expression to serialize parsed value to JSON. - * If not provided, value passes through unchanged. - * Used for types that need transformation during serialization (Set → Array, etc.) - */ - toJsonExpression?: (parsed: ts.Expression) => ts.Expression; -} - -/** - * Extended schema interface with utility methods for transformations - */ -export interface SchemaWithUtils extends Schema { - /** - * Generate parse expression: raw JSON -> parsed type - */ - parse: (raw: ts.Expression, opts: Required) => ts.Expression; - - /** - * Generate json expression: parsed type -> raw JSON - */ - json: (parsed: ts.Expression, opts: Required) => ts.Expression; - - /** - * Generate parseOrThrow expression - */ - parseOrThrow: (raw: ts.Expression, opts: Required) => ts.Expression; - - /** - * Generate jsonOrThrow expression - */ - jsonOrThrow: (parsed: ts.Expression, opts: Required) => ts.Expression; - - /** - * Wrap schema to allow null values - */ - nullable: () => SchemaWithUtils; - - /** - * Wrap schema to allow undefined values - */ - optional: () => SchemaWithUtils; - - /** - * Wrap schema to allow both null and undefined values - */ - optionalNullable: () => SchemaWithUtils; - - /** - * Apply a transform to the schema - */ - transform: (args: { - newShape: ts.TypeNode | undefined; - transform: ts.Expression; - untransform: ts.Expression; - }) => SchemaWithUtils; -} - -/** - * Schema interface for object-like types (objects, unions) - */ -export interface ObjectLikeSchema extends SchemaWithUtils { - /** - * Add computed properties to the parsed output - */ - withParsedProperties: (properties: AdditionalProperty[]) => ObjectLikeSchema; -} - -/** - * Schema interface for object types with extend/passthrough capabilities - */ -export interface ObjectSchema extends ObjectLikeSchema { - /** - * Extend this object schema with another schema's properties - */ - extend: (extension: Schema) => ObjectSchema; - - /** - * Allow unknown properties to pass through - */ - passthrough: () => ObjectSchema; -} - -/** - * Property definition for object schemas - */ -export interface Property { - key: { - /** The property name in the parsed TypeScript type */ - parsed: string; - /** The property name in the raw JSON */ - raw: string; - }; - value: Schema; -} - -/** - * Additional property to be added during parsing - */ -export interface AdditionalProperty { - key: string; - getValue: (args: { getReferenceToParsed: () => ts.Expression }) => ts.Expression; -} - -/** - * Arguments for creating a discriminated union schema - */ -export interface UnionArgs { - /** The discriminant property name in the parsed type */ - parsedDiscriminant: string; - /** The discriminant property name in the raw JSON */ - rawDiscriminant: string; - /** The union member types */ - singleUnionTypes: SingleUnionType[]; -} - -/** - * A single variant of a discriminated union - */ -export interface SingleUnionType { - /** The discriminant value that identifies this variant */ - discriminantValue: string; - /** Schema for the non-discriminant properties */ - nonDiscriminantProperties: ObjectSchema; -} - -/** - * Runtime dependencies required by the serialization format - */ -export interface RuntimeDependency { - name: string; - version: string; -} - -/** - * The main serialization format protocol. - * Each format (Zurg, Zod, etc.) implements this interface. + * The main serialization format protocol. Describes how an object goes from the internal Fern format to generated ASTs. + * To add new supported serialization options, conform to this protocol. */ export interface SerializationFormat { /** @@ -182,106 +17,109 @@ export interface SerializationFormat { /** * Create an object schema with the given properties */ - object: (properties: Property[]) => ObjectSchema; + object: (properties: SerializationFormat.Property[]) => SerializationFormat.ObjectSchema; /** * Create an object schema where all properties are required (no optionals) */ - objectWithoutOptionalProperties: (properties: Property[]) => ObjectSchema; + objectWithoutOptionalProperties: (properties: SerializationFormat.Property[]) => SerializationFormat.ObjectSchema; /** * Create a discriminated union schema */ - union: (args: UnionArgs) => ObjectLikeSchema; + union: (args: SerializationFormat.UnionArgs) => SerializationFormat.ObjectLikeSchema; /** * Create an undiscriminated union schema */ - undiscriminatedUnion: (schemas: Schema[]) => SchemaWithUtils; + undiscriminatedUnion: (schemas: SerializationFormat.Schema[]) => SerializationFormat.SchemaWithUtils; /** * Create an array/list schema */ - list: (itemSchema: Schema) => SchemaWithUtils; + list: (itemSchema: SerializationFormat.Schema) => SerializationFormat.SchemaWithUtils; /** * Create a Set schema */ - set: (itemSchema: Schema) => SchemaWithUtils; + set: (itemSchema: SerializationFormat.Schema) => SerializationFormat.SchemaWithUtils; /** * Create a Record/Map schema */ - record: (args: { keySchema: Schema; valueSchema: Schema }) => SchemaWithUtils; + record: (args: { + keySchema: SerializationFormat.Schema; + valueSchema: SerializationFormat.Schema; + }) => SerializationFormat.SchemaWithUtils; /** * Create an enum schema */ - enum: (values: string[]) => SchemaWithUtils; + enum: (values: string[]) => SerializationFormat.SchemaWithUtils; // ==================== Primitive Schemas ==================== /** * Create a string schema */ - string: () => SchemaWithUtils; + string: () => SerializationFormat.SchemaWithUtils; /** * Create a string literal schema */ - stringLiteral: (literal: string) => SchemaWithUtils; + stringLiteral: (literal: string) => SerializationFormat.SchemaWithUtils; /** * Create a boolean literal schema */ - booleanLiteral: (literal: boolean) => SchemaWithUtils; + booleanLiteral: (literal: boolean) => SerializationFormat.SchemaWithUtils; /** * Create a date schema (parses ISO strings to Date objects) */ - date: () => SchemaWithUtils; + date: () => SerializationFormat.SchemaWithUtils; /** * Create a number schema */ - number: () => SchemaWithUtils; + number: () => SerializationFormat.SchemaWithUtils; /** * Create a bigint schema */ - bigint: () => SchemaWithUtils; + bigint: () => SerializationFormat.SchemaWithUtils; /** * Create a boolean schema */ - boolean: () => SchemaWithUtils; + boolean: () => SerializationFormat.SchemaWithUtils; /** * Create an any schema (allows any value) */ - any: () => SchemaWithUtils; + any: () => SerializationFormat.SchemaWithUtils; /** * Create an unknown schema */ - unknown: () => SchemaWithUtils; + unknown: () => SerializationFormat.SchemaWithUtils; /** * Create a never schema (always fails validation) */ - never: () => SchemaWithUtils; + never: () => SerializationFormat.SchemaWithUtils; // ==================== Schema Wrappers ==================== /** * Create a lazy schema for recursive types */ - lazy: (schema: Schema) => SchemaWithUtils; + lazy: (schema: SerializationFormat.Schema) => SerializationFormat.SchemaWithUtils; /** * Create a lazy object schema for recursive object types */ - lazyObject: (schema: Schema) => ObjectSchema; + lazyObject: (schema: SerializationFormat.Schema) => SerializationFormat.ObjectSchema; // ==================== Type Utilities ==================== @@ -297,7 +135,10 @@ export interface SerializationFormat { /** * Create a schema from a raw expression */ - _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }) => SchemaWithUtils; + _fromExpression: ( + expression: ts.Expression, + opts?: { isObject: boolean } + ) => SerializationFormat.SchemaWithUtils; /** * Generate if/else statements for handling MaybeValid results @@ -358,16 +199,188 @@ export interface SerializationFormat { } /** - * Configuration for creating a serialization format + * Namespace containing all types related to SerializationFormat. + * Use these types like: SerializationFormat.Schema, SerializationFormat.Property, etc. */ -export interface SerializationFormatConfig { +export namespace SerializationFormat { + /** + * Options passed to schema parse/json operations + */ + export interface SchemaOptions { + unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; + allowUnrecognizedUnionMembers?: boolean; + allowUnrecognizedEnumValues?: boolean; + skipValidation?: boolean; + omitUndefined?: boolean; + breadcrumbsPrefix?: string[]; + } + + /** + * Base schema interface that all format-specific schemas must implement. + * This represents a schema that can generate TypeScript AST expressions. + */ + export interface Schema { + /** + * Generates the TypeScript AST expression for this schema definition + */ + toExpression: () => ts.Expression; + + /** + * Whether this schema represents an optional value + */ + isOptional: boolean; + + /** + * Whether this schema represents a nullable value + */ + isNullable: boolean; + + /** + * Optional: Generate expression to serialize parsed value to JSON. + * If not provided, value passes through unchanged. + * Used for types that need transformation during serialization (Set → Array, etc.) + */ + toJsonExpression?: (parsed: ts.Expression) => ts.Expression; + } + + /** + * Extended schema interface with utility methods for transformations + */ + export interface SchemaWithUtils extends Schema { + /** + * Generate parse expression: raw JSON -> parsed type + */ + parse: (raw: ts.Expression, opts: Required) => ts.Expression; + + /** + * Generate json expression: parsed type -> raw JSON + */ + json: (parsed: ts.Expression, opts: Required) => ts.Expression; + + /** + * Generate parseOrThrow expression + */ + parseOrThrow: (raw: ts.Expression, opts: Required) => ts.Expression; + + /** + * Generate jsonOrThrow expression + */ + jsonOrThrow: (parsed: ts.Expression, opts: Required) => ts.Expression; + + /** + * Wrap schema to allow null values + */ + nullable: () => SchemaWithUtils; + + /** + * Wrap schema to allow undefined values + */ + optional: () => SchemaWithUtils; + + /** + * Wrap schema to allow both null and undefined values + */ + optionalNullable: () => SchemaWithUtils; + + /** + * Apply a transform to the schema + */ + transform: (args: { + newShape: ts.TypeNode | undefined; + transform: ts.Expression; + untransform: ts.Expression; + }) => SchemaWithUtils; + } + + /** + * Additional property to be added during parsing + */ + export interface AdditionalProperty { + key: string; + getValue: (args: { getReferenceToParsed: () => ts.Expression }) => ts.Expression; + } + /** - * Function to get a reference to an exported name from the format's module + * Schema interface for object-like types (objects, unions) */ - getReferenceToExport: (args: { manifest: any; exportedName: string }) => Reference; + export interface ObjectLikeSchema extends SchemaWithUtils { + /** + * Add computed properties to the parsed output + */ + withParsedProperties: (properties: AdditionalProperty[]) => ObjectLikeSchema; + } /** - * Whether to generate endpoint metadata + * Schema interface for object types with extend/passthrough capabilities */ - generateEndpointMetadata: boolean; + export interface ObjectSchema extends ObjectLikeSchema { + /** + * Extend this object schema with another schema's properties + */ + extend: (extension: Schema) => ObjectSchema; + + /** + * Allow unknown properties to pass through + */ + passthrough: () => ObjectSchema; + } + + /** + * Property definition for object schemas + */ + export interface Property { + key: { + /** The property name in the parsed TypeScript type */ + parsed: string; + /** The property name in the raw JSON */ + raw: string; + }; + value: Schema; + } + + /** + * A single variant of a discriminated union + */ + export interface SingleUnionType { + /** The discriminant value that identifies this variant */ + discriminantValue: string; + /** Schema for the non-discriminant properties */ + nonDiscriminantProperties: ObjectSchema; + } + + /** + * Arguments for creating a discriminated union schema + */ + export interface UnionArgs { + /** The discriminant property name in the parsed type */ + parsedDiscriminant: string; + /** The discriminant property name in the raw JSON */ + rawDiscriminant: string; + /** The union member types */ + singleUnionTypes: SingleUnionType[]; + } + + /** + * Runtime dependencies required by the serialization format. + * Note this is required for the legacy zurg integration until it can be fully refactored. + */ + export interface RuntimeDependency { + name: string; + version: string; + } + + /** + * Configuration for creating a serialization format + */ + export interface Config { + /** + * Function to get a reference to an exported name from the format's module + */ + getReferenceToExport: (args: { manifest: any; exportedName: string }) => Reference; + + /** + * Whether to generate endpoint metadata + */ + generateEndpointMetadata: boolean; + } } diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index 660148e8af7f..4f7308f6663f 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -1,7 +1,7 @@ import { PassthroughFormat } from "./formats/PassthroughFormat"; import { ZodFormat } from "./formats/ZodFormat"; import { ZurgFormat } from "./formats/ZurgFormat"; -import { SerializationFormat, SerializationFormatConfig } from "./SerializationFormat"; +import { SerializationFormat } from "./SerializationFormat"; /** * Supported serialization format types @@ -11,7 +11,7 @@ export type SerializationFormatType = "zurg" | "zod" | "none"; /** * Configuration for creating a SerializationPipeline */ -export interface SerializationPipelineConfig extends SerializationFormatConfig { +export interface SerializationPipelineConfig extends SerializationFormat.Config { /** * The serialization format to use. * - "zurg": Use Zurg (bundled runtime) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts index a22d01e35822..2378121d0915 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/PassthroughFormat.ts @@ -1,22 +1,11 @@ import { ts } from "ts-morph"; -import { - AdditionalProperty, - ObjectLikeSchema, - ObjectSchema, - Property, - Schema, - SchemaOptions, - SchemaWithUtils, - SerializationFormat, - SerializationFormatConfig, - UnionArgs -} from "../SerializationFormat"; +import { SerializationFormat } from "../SerializationFormat"; /** * A no-op schema that does nothing - used when serialization is disabled. */ -const NO_OP_SCHEMA: SchemaWithUtils = { +const NO_OP_SCHEMA: SerializationFormat.SchemaWithUtils = { toExpression: () => ts.factory.createIdentifier("undefined"), isOptional: false, isNullable: false, @@ -33,9 +22,9 @@ const NO_OP_SCHEMA: SchemaWithUtils = { /** * A no-op object schema */ -const NO_OP_OBJECT_SCHEMA: ObjectSchema = { +const NO_OP_OBJECT_SCHEMA: SerializationFormat.ObjectSchema = { ...NO_OP_SCHEMA, - withParsedProperties: () => NO_OP_OBJECT_SCHEMA as ObjectLikeSchema, + withParsedProperties: () => NO_OP_OBJECT_SCHEMA as SerializationFormat.ObjectLikeSchema, extend: () => NO_OP_OBJECT_SCHEMA, passthrough: () => NO_OP_OBJECT_SCHEMA }; @@ -48,37 +37,48 @@ const NO_OP_OBJECT_SCHEMA: ObjectSchema = { export class PassthroughFormat implements SerializationFormat { public readonly name = "none" as const; - constructor(_config: SerializationFormatConfig) { + constructor(_config: SerializationFormat.Config) { // No configuration needed for passthrough format } // All schema builders return no-op schemas - public object = (_properties: Property[]): ObjectSchema => NO_OP_OBJECT_SCHEMA; - public objectWithoutOptionalProperties = (_properties: Property[]): ObjectSchema => NO_OP_OBJECT_SCHEMA; - public union = (_args: UnionArgs): ObjectLikeSchema => NO_OP_OBJECT_SCHEMA as ObjectLikeSchema; - public undiscriminatedUnion = (_schemas: Schema[]): SchemaWithUtils => NO_OP_SCHEMA; - public list = (_itemSchema: Schema): SchemaWithUtils => NO_OP_SCHEMA; - public set = (_itemSchema: Schema): SchemaWithUtils => NO_OP_SCHEMA; - public record = (_args: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => NO_OP_SCHEMA; - public enum = (_values: string[]): SchemaWithUtils => NO_OP_SCHEMA; - public string = (): SchemaWithUtils => NO_OP_SCHEMA; - public stringLiteral = (_literal: string): SchemaWithUtils => NO_OP_SCHEMA; - public booleanLiteral = (_literal: boolean): SchemaWithUtils => NO_OP_SCHEMA; - public date = (): SchemaWithUtils => NO_OP_SCHEMA; - public number = (): SchemaWithUtils => NO_OP_SCHEMA; - public bigint = (): SchemaWithUtils => NO_OP_SCHEMA; - public boolean = (): SchemaWithUtils => NO_OP_SCHEMA; - public any = (): SchemaWithUtils => NO_OP_SCHEMA; - public unknown = (): SchemaWithUtils => NO_OP_SCHEMA; - public never = (): SchemaWithUtils => NO_OP_SCHEMA; - public lazy = (_schema: Schema): SchemaWithUtils => NO_OP_SCHEMA; - public lazyObject = (_schema: Schema): ObjectSchema => NO_OP_OBJECT_SCHEMA; + public object = (_properties: SerializationFormat.Property[]): SerializationFormat.ObjectSchema => + NO_OP_OBJECT_SCHEMA; + public objectWithoutOptionalProperties = ( + _properties: SerializationFormat.Property[] + ): SerializationFormat.ObjectSchema => NO_OP_OBJECT_SCHEMA; + public union = (_args: SerializationFormat.UnionArgs): SerializationFormat.ObjectLikeSchema => + NO_OP_OBJECT_SCHEMA as SerializationFormat.ObjectLikeSchema; + public undiscriminatedUnion = (_schemas: SerializationFormat.Schema[]): SerializationFormat.SchemaWithUtils => + NO_OP_SCHEMA; + public list = (_itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public set = (_itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public record = (_args: { + keySchema: SerializationFormat.Schema; + valueSchema: SerializationFormat.Schema; + }): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public enum = (_values: string[]): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public string = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public stringLiteral = (_literal: string): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public booleanLiteral = (_literal: boolean): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public date = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public number = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public bigint = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public boolean = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public any = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public unknown = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public never = (): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public lazy = (_schema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => NO_OP_SCHEMA; + public lazyObject = (_schema: SerializationFormat.Schema): SerializationFormat.ObjectSchema => NO_OP_OBJECT_SCHEMA; public Schema = { _getReferenceToType: (_args: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }): ts.TypeNode => { return ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword); }, - _fromExpression: (_expression: ts.Expression, _opts?: { isObject: boolean }): SchemaWithUtils => { + _fromExpression: ( + _expression: ts.Expression, + _opts?: { isObject: boolean } + ): SerializationFormat.SchemaWithUtils => { return NO_OP_SCHEMA; }, _visitMaybeValid: ( diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 8a99fd2db936..9eaa04ac7411 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -1,18 +1,7 @@ import { ts } from "ts-morph"; import { ImportsManager } from "../../imports-manager"; -import { - AdditionalProperty, - ObjectLikeSchema, - ObjectSchema, - Property, - Schema, - SchemaOptions, - SchemaWithUtils, - SerializationFormat, - SerializationFormatConfig, - UnionArgs -} from "../SerializationFormat"; +import { SerializationFormat } from "../SerializationFormat"; /** * Zod version to use as dependency. @@ -24,7 +13,7 @@ export const ZOD_VERSION = "^3.23.0"; /** * Base schema implementation for Zod format */ -interface ZodBaseSchema extends Schema { +interface ZodBaseSchema extends SerializationFormat.Schema { toExpression: () => ts.Expression; isOptional: boolean; isNullable: boolean; @@ -72,7 +61,7 @@ export class ZodFormat implements SerializationFormat { private importsManager?: ImportsManager; private hasAddedZodImport = false; - constructor(_config: SerializationFormatConfig, importsManager?: ImportsManager) { + constructor(_config: SerializationFormat.Config, importsManager?: ImportsManager) { this.importsManager = importsManager; } @@ -96,7 +85,7 @@ export class ZodFormat implements SerializationFormat { // ==================== Schema Utilities ==================== - private getSchemaUtils(baseSchema: ZodBaseSchema): Omit { + private getSchemaUtils(baseSchema: ZodBaseSchema): Omit { return { nullable: () => this.nullable(baseSchema), optional: () => this.optional(baseSchema), @@ -143,7 +132,7 @@ export class ZodFormat implements SerializationFormat { /** * Wrap schema to allow null values. */ - private nullable(schema: ZodBaseSchema): SchemaWithUtils { + private nullable(schema: ZodBaseSchema): SerializationFormat.SchemaWithUtils { const baseSchema: ZodBaseSchema = { isOptional: schema.isOptional, isNullable: true, @@ -174,7 +163,7 @@ export class ZodFormat implements SerializationFormat { /** * Wrap schema to allow undefined values. */ - private optional(schema: ZodBaseSchema): SchemaWithUtils { + private optional(schema: ZodBaseSchema): SerializationFormat.SchemaWithUtils { const baseSchema: ZodBaseSchema = { isOptional: true, isNullable: schema.isNullable, @@ -205,7 +194,7 @@ export class ZodFormat implements SerializationFormat { /** * Wrap schema to allow both null and undefined values. */ - private optionalNullable(schema: ZodBaseSchema): SchemaWithUtils { + private optionalNullable(schema: ZodBaseSchema): SerializationFormat.SchemaWithUtils { const baseSchema: ZodBaseSchema = { isOptional: true, isNullable: true, @@ -235,13 +224,13 @@ export class ZodFormat implements SerializationFormat { // ==================== Object-like Utilities ==================== - private getObjectLikeUtils(_objectLike: ZodBaseSchema): Pick { + private getObjectLikeUtils(_objectLike: ZodBaseSchema): Pick { return { - withParsedProperties: (additionalProperties: AdditionalProperty[]) => { + withParsedProperties: (additionalProperties: SerializationFormat.AdditionalProperty[]) => { // Zod doesn't have direct equivalent of withParsedProperties // We use .transform() to add computed properties if (additionalProperties.length === 0) { - return _objectLike as unknown as ObjectLikeSchema; + return _objectLike as unknown as SerializationFormat.ObjectLikeSchema; } const transformExpr = ts.factory.createArrowFunction( @@ -282,9 +271,9 @@ export class ZodFormat implements SerializationFormat { // ==================== Object Utilities ==================== - private getObjectUtils(objectSchema: ZodBaseSchema): Pick { + private getObjectUtils(objectSchema: ZodBaseSchema): Pick { return { - extend: (extension) => { + extend: (extension: SerializationFormat.Schema) => { // Zod uses .merge() for extending objects const extendedExpr = chainMethod(objectSchema.toExpression(), "merge", [extension.toExpression()]); const newBase: ZodBaseSchema = { @@ -319,7 +308,7 @@ export class ZodFormat implements SerializationFormat { // ==================== Object Schema Builders ==================== - public object = (properties: Property[]): ObjectSchema => { + public object = (properties: SerializationFormat.Property[]): SerializationFormat.ObjectSchema => { // Check if any property has toJsonExpression (needs serialization transform) const propsWithJsonTransform = properties.filter((p) => (p.value as ZodBaseSchema).toJsonExpression != null); @@ -437,7 +426,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public objectWithoutOptionalProperties = (properties: Property[]): ObjectSchema => { + public objectWithoutOptionalProperties = (properties: SerializationFormat.Property[]): SerializationFormat.ObjectSchema => { // In Zod, we use .strict() to disallow extra properties // For "without optional properties", we just create a regular object // The optionality is handled at the property level @@ -446,7 +435,7 @@ export class ZodFormat implements SerializationFormat { // ==================== Union Schema Builders ==================== - public union = ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: UnionArgs): ObjectLikeSchema => { + public union = ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: SerializationFormat.UnionArgs): SerializationFormat.ObjectLikeSchema => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -528,7 +517,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public undiscriminatedUnion = (schemas: Schema[]): SchemaWithUtils => { + public undiscriminatedUnion = (schemas: SerializationFormat.Schema[]): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -550,7 +539,7 @@ export class ZodFormat implements SerializationFormat { // ==================== Collection Schema Builders ==================== - public list = (itemSchema: Schema): SchemaWithUtils => { + public list = (itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -581,7 +570,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public set = (itemSchema: Schema): SchemaWithUtils => { + public set = (itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { // JSON wire format uses arrays for sets // Parsing: z.array().transform(arr => new Set(arr)) converts array → Set // Serialization: Array.from() converts Set → Array (with item serialization if needed) @@ -650,9 +639,9 @@ export class ZodFormat implements SerializationFormat { keySchema: _keySchema, valueSchema }: { - keySchema: Schema; - valueSchema: Schema; - }): SchemaWithUtils => { + keySchema: SerializationFormat.Schema; + valueSchema: SerializationFormat.Schema; + }): SerializationFormat.SchemaWithUtils => { // JSON object keys are always strings, so we use z.string() for the key // regardless of the declared key type (e.g., even if Fern declares map) const baseSchema: ZodBaseSchema = { @@ -719,7 +708,7 @@ export class ZodFormat implements SerializationFormat { // ==================== Enum Schema Builder ==================== - public enum = (values: string[]): SchemaWithUtils => { + public enum = (values: string[]): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -740,7 +729,7 @@ export class ZodFormat implements SerializationFormat { // ==================== Primitive Schema Builders ==================== - public string = (): SchemaWithUtils => { + public string = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -753,7 +742,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public stringLiteral = (literal: string): SchemaWithUtils => { + public stringLiteral = (literal: string): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -766,7 +755,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public booleanLiteral = (literal: boolean): SchemaWithUtils => { + public booleanLiteral = (literal: boolean): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -779,7 +768,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public number = (): SchemaWithUtils => { + public number = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -792,7 +781,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public bigint = (): SchemaWithUtils => { + public bigint = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -805,7 +794,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public boolean = (): SchemaWithUtils => { + public boolean = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -818,7 +807,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public date = (): SchemaWithUtils => { + public date = (): SerializationFormat.SchemaWithUtils => { // Zod's z.date() parses Date objects, but we need to parse ISO strings // Use z.coerce.date() or z.string().transform() for ISO string parsing const baseSchema: ZodBaseSchema = { @@ -854,7 +843,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public any = (): SchemaWithUtils => { + public any = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: true, // any includes null @@ -867,7 +856,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public unknown = (): SchemaWithUtils => { + public unknown = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: true, // unknown can be undefined isNullable: false, @@ -880,7 +869,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public never = (): SchemaWithUtils => { + public never = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, @@ -895,7 +884,7 @@ export class ZodFormat implements SerializationFormat { // ==================== Lazy Schema Builders ==================== - public lazy = (schema: Schema): SchemaWithUtils => { + public lazy = (schema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: schema.isOptional, isNullable: schema.isNullable, @@ -918,7 +907,7 @@ export class ZodFormat implements SerializationFormat { }; }; - public lazyObject = (schema: Schema): ObjectSchema => { + public lazyObject = (schema: SerializationFormat.Schema): SerializationFormat.ObjectSchema => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: schema.isNullable, @@ -1004,7 +993,7 @@ export class ZodFormat implements SerializationFormat { ]); }, - _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SchemaWithUtils => { + _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SerializationFormat.SchemaWithUtils => { // For Zod format, schemas are wrapped with { _schema, parse, json } structure // When used in schema composition (z.array, z.record, etc.), we need the actual Zod schema // When serializing, we call the wrapper's .json() method @@ -1028,7 +1017,7 @@ export class ZodFormat implements SerializationFormat { ...this.getSchemaUtils(baseSchema), ...this.getObjectLikeUtils(baseSchema), ...this.getObjectUtils(baseSchema) - } as SchemaWithUtils; + } as SerializationFormat.SchemaWithUtils; } return { ...baseSchema, diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts index cbb244664e09..2d869742d7b2 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZurgFormat.ts @@ -2,19 +2,7 @@ import { ts } from "ts-morph"; import { CoreUtility } from "../../core-utilities/CoreUtility"; import { ImportsManager } from "../../imports-manager"; -import { - AdditionalProperty, - ObjectLikeSchema, - ObjectSchema, - Property, - Schema, - SchemaOptions, - SchemaWithUtils, - SerializationFormat, - SerializationFormatConfig, - SingleUnionType, - UnionArgs -} from "../SerializationFormat"; +import { SerializationFormat } from "../SerializationFormat"; /** * Manifest for the Zurg runtime files. @@ -35,7 +23,7 @@ export const ZURG_MANIFEST: CoreUtility.Manifest = { /** * Base schema implementation for Zurg format */ -interface ZurgBaseSchema extends Schema { +interface ZurgBaseSchema extends SerializationFormat.Schema { toExpression: () => ts.Expression; isOptional: boolean; isNullable: boolean; @@ -80,7 +68,7 @@ export class ZurgFormat implements SerializationFormat { private hasAddedSerializationImport = false; private generateEndpointMetadata: boolean; - constructor(config: SerializationFormatConfig, importsManager?: ImportsManager) { + constructor(config: SerializationFormat.Config, importsManager?: ImportsManager) { this.importsManager = importsManager; this.generateEndpointMetadata = config.generateEndpointMetadata; } @@ -105,7 +93,9 @@ export class ZurgFormat implements SerializationFormat { // ==================== Schema Utilities ==================== - private getSchemaUtils(baseSchema: ZurgBaseSchema): Omit { + private getSchemaUtils( + baseSchema: ZurgBaseSchema + ): Omit { return { nullable: () => this.nullable(baseSchema), optional: () => this.optional(baseSchema), @@ -150,7 +140,7 @@ export class ZurgFormat implements SerializationFormat { }; } - private constructSchemaOptionsArgs(schemaOptions: Required): ts.Expression[] { + private constructSchemaOptionsArgs(schemaOptions: Required): ts.Expression[] { const properties: ts.ObjectLiteralElementLike[] = []; if (schemaOptions.unrecognizedObjectKeys !== "fail") { @@ -211,7 +201,7 @@ export class ZurgFormat implements SerializationFormat { } } - private nullable(schema: ZurgBaseSchema): SchemaWithUtils { + private nullable(schema: ZurgBaseSchema): SerializationFormat.SchemaWithUtils { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: true, @@ -224,7 +214,7 @@ export class ZurgFormat implements SerializationFormat { }; } - private optional(schema: ZurgBaseSchema): SchemaWithUtils { + private optional(schema: ZurgBaseSchema): SerializationFormat.SchemaWithUtils { const baseSchema: ZurgBaseSchema = { isOptional: true, isNullable: false, @@ -237,7 +227,7 @@ export class ZurgFormat implements SerializationFormat { }; } - private optionalNullable(schema: ZurgBaseSchema): SchemaWithUtils { + private optionalNullable(schema: ZurgBaseSchema): SerializationFormat.SchemaWithUtils { const baseSchema: ZurgBaseSchema = { isOptional: true, isNullable: true, @@ -253,7 +243,7 @@ export class ZurgFormat implements SerializationFormat { private transform( schema: ZurgBaseSchema, { newShape, transformer }: { newShape: ts.TypeNode | undefined; transformer: ZurgBaseSchema } - ): SchemaWithUtils { + ): SerializationFormat.SchemaWithUtils { const baseSchema: ZurgBaseSchema = { isOptional: transformer.isOptional, isNullable: transformer.isNullable, @@ -276,17 +266,19 @@ export class ZurgFormat implements SerializationFormat { // ==================== Object-like Utilities ==================== - private getObjectLikeUtils(objectLike: ZurgBaseSchema): Pick { + private getObjectLikeUtils( + objectLike: ZurgBaseSchema + ): Pick { return { - withParsedProperties: (additionalProperties: AdditionalProperty[]) => + withParsedProperties: (additionalProperties: SerializationFormat.AdditionalProperty[]) => this.withParsedProperties(objectLike, additionalProperties) }; } private withParsedProperties( objectLike: ZurgBaseSchema, - additionalProperties: AdditionalProperty[] - ): ObjectLikeSchema { + additionalProperties: SerializationFormat.AdditionalProperty[] + ): SerializationFormat.ObjectLikeSchema { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -354,7 +346,9 @@ export class ZurgFormat implements SerializationFormat { // ==================== Object Utilities ==================== - private getObjectUtils(objectSchema: ZurgBaseSchema): Pick { + private getObjectUtils( + objectSchema: ZurgBaseSchema + ): Pick { return { extend: (extension) => this.extend(objectSchema, extension as ZurgBaseSchema), passthrough: () => { @@ -374,7 +368,7 @@ export class ZurgFormat implements SerializationFormat { }; } - private extend(objectSchema: ZurgBaseSchema, extension: ZurgBaseSchema): ObjectSchema { + private extend(objectSchema: ZurgBaseSchema, extension: ZurgBaseSchema): SerializationFormat.ObjectSchema { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -391,7 +385,7 @@ export class ZurgFormat implements SerializationFormat { // ==================== Object Schema Builders ==================== - public object = (properties: Property[]): ObjectSchema => { + public object = (properties: SerializationFormat.Property[]): SerializationFormat.ObjectSchema => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -406,7 +400,9 @@ export class ZurgFormat implements SerializationFormat { }; }; - public objectWithoutOptionalProperties = (properties: Property[]): ObjectSchema => { + public objectWithoutOptionalProperties = ( + properties: SerializationFormat.Property[] + ): SerializationFormat.ObjectSchema => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -424,7 +420,9 @@ export class ZurgFormat implements SerializationFormat { }; }; - private constructObjectLiteralForProperties(properties: Property[]): ts.ObjectLiteralExpression { + private constructObjectLiteralForProperties( + properties: SerializationFormat.Property[] + ): ts.ObjectLiteralExpression { return ts.factory.createObjectLiteralExpression( properties.map((property) => { let value = property.value.toExpression(); @@ -443,7 +441,11 @@ export class ZurgFormat implements SerializationFormat { // ==================== Union Schema Builders ==================== - public union = ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: UnionArgs): ObjectLikeSchema => { + public union = ({ + parsedDiscriminant, + rawDiscriminant, + singleUnionTypes + }: SerializationFormat.UnionArgs): SerializationFormat.ObjectLikeSchema => { const discriminantArgument = parsedDiscriminant === rawDiscriminant ? ts.factory.createStringLiteral(parsedDiscriminant) @@ -487,7 +489,7 @@ export class ZurgFormat implements SerializationFormat { ]); } - public undiscriminatedUnion = (schemas: Schema[]): SchemaWithUtils => { + public undiscriminatedUnion = (schemas: SerializationFormat.Schema[]): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -505,7 +507,7 @@ export class ZurgFormat implements SerializationFormat { // ==================== Collection Schema Builders ==================== - public list = (itemSchema: Schema): SchemaWithUtils => { + public list = (itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -518,7 +520,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public set = (itemSchema: Schema): SchemaWithUtils => { + public set = (itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -531,7 +533,13 @@ export class ZurgFormat implements SerializationFormat { }; }; - public record = ({ keySchema, valueSchema }: { keySchema: Schema; valueSchema: Schema }): SchemaWithUtils => { + public record = ({ + keySchema, + valueSchema + }: { + keySchema: SerializationFormat.Schema; + valueSchema: SerializationFormat.Schema; + }): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -546,7 +554,7 @@ export class ZurgFormat implements SerializationFormat { // ==================== Enum Schema Builder ==================== - public enum = (values: string[]): SchemaWithUtils => { + public enum = (values: string[]): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -566,7 +574,7 @@ export class ZurgFormat implements SerializationFormat { // ==================== Primitive Schema Builders ==================== - public string = (): SchemaWithUtils => { + public string = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -579,7 +587,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public stringLiteral = (literal: string): SchemaWithUtils => { + public stringLiteral = (literal: string): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -592,7 +600,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public booleanLiteral = (literal: boolean): SchemaWithUtils => { + public booleanLiteral = (literal: boolean): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -606,7 +614,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public number = (): SchemaWithUtils => { + public number = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -619,7 +627,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public bigint = (): SchemaWithUtils => { + public bigint = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -632,7 +640,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public boolean = (): SchemaWithUtils => { + public boolean = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -645,7 +653,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public date = (): SchemaWithUtils => { + public date = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -658,7 +666,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public any = (): SchemaWithUtils => { + public any = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: true, @@ -671,7 +679,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public unknown = (): SchemaWithUtils => { + public unknown = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: true, isNullable: false, @@ -684,7 +692,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public never = (): SchemaWithUtils => { + public never = (): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -699,7 +707,7 @@ export class ZurgFormat implements SerializationFormat { // ==================== Lazy Schema Builders ==================== - public lazy = (schema: Schema): SchemaWithUtils => { + public lazy = (schema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: schema.isOptional, isNullable: schema.isNullable, @@ -715,7 +723,7 @@ export class ZurgFormat implements SerializationFormat { }; }; - public lazyObject = (schema: Schema): ObjectSchema => { + public lazyObject = (schema: SerializationFormat.Schema): SerializationFormat.ObjectSchema => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: schema.isNullable, @@ -747,7 +755,10 @@ export class ZurgFormat implements SerializationFormat { ); }, - _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SchemaWithUtils => { + _fromExpression: ( + expression: ts.Expression, + opts?: { isObject: boolean } + ): SerializationFormat.SchemaWithUtils => { const baseSchema: ZurgBaseSchema = { isOptional: false, isNullable: false, @@ -759,7 +770,7 @@ export class ZurgFormat implements SerializationFormat { ...this.getSchemaUtils(baseSchema), ...this.getObjectLikeUtils(baseSchema), ...this.getObjectUtils(baseSchema) - } as SchemaWithUtils; + } as SerializationFormat.SchemaWithUtils; } return { ...baseSchema, diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts index 9483f130b18c..cd35a4821491 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts @@ -1,3 +1,3 @@ export { PassthroughFormat } from "./PassthroughFormat"; -export { ZodFormat } from "./ZodFormat"; +export { ZodFormat, ZOD_VERSION } from "./ZodFormat"; export { ZURG_MANIFEST, ZurgFormat } from "./ZurgFormat"; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts index 0f264ee98701..2fa04699b275 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/index.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/index.ts @@ -1,18 +1,5 @@ -export { PassthroughFormat, ZodFormat, ZURG_MANIFEST, ZurgFormat } from "./formats"; -export { - type AdditionalProperty, - type ObjectLikeSchema, - type ObjectSchema, - type Property, - type RuntimeDependency, - type Schema, - type SchemaOptions, - type SchemaWithUtils, - type SerializationFormat, - type SerializationFormatConfig, - type SingleUnionType, - type UnionArgs -} from "./SerializationFormat"; +export { PassthroughFormat, ZOD_VERSION, ZodFormat, ZURG_MANIFEST, ZurgFormat } from "./formats"; +export * from "./SerializationFormat"; export { type SerializationFormatType, SerializationPipeline, From d5363a6a22b5b491ee0cfb198354b41ba58cf28a Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 12:36:18 -0500 Subject: [PATCH 64/71] comments --- .../SerializationPipeline.ts | 35 ++- .../formats/ZodFormat.ts | 288 +++++++++++++++--- 2 files changed, 269 insertions(+), 54 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index 4f7308f6663f..2e42a8cb8548 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -22,21 +22,31 @@ export interface SerializationPipelineConfig extends SerializationFormat.Config } /** - * SerializationPipeline manages the creation and configuration of serialization formats. - * It provides a unified interface for generating schema AST code regardless of the - * underlying format being used. + * SerializationPipeline is an abstraction around various serialization formats. It provides a unified interface + * for generating serialization schema AST code regardless of the underlying format being used. */ export class SerializationPipeline { + /** + * The concrete format implementation. + */ private readonly format: SerializationFormat; + + /** + * The type of the selected serialization format. + */ private readonly formatType: SerializationFormatType; + /** + * Create a new SerializationPipeline instance. + * @param config - The configuration for the pipeline. + */ constructor(config: SerializationPipelineConfig) { this.formatType = config.format; this.format = this.createFormat(config); } /** - * Create the appropriate serialization format based on configuration + * Given a pipeline configuration, generate the appropriate serialization format. */ private createFormat(config: SerializationPipelineConfig): SerializationFormat { switch (config.format) { @@ -69,29 +79,36 @@ export class SerializationPipeline { } /** - * Check if serialization is enabled + * Check if serialization is enabled i.e. not passthrough. */ public isEnabled(): boolean { return this.formatType !== "none"; } /** - * Get runtime dependencies required by the active format + * Check if the serialization format is passthrough. */ + public isPassthrough(): boolean { + return this.formatType === "none"; + } + + /** + * Get runtime dependencies required by the active format. + * Note: only used for legacy zurg format until it can be refactored into a npm dependency. public getRuntimeDependencies(): Record { return this.format.getRuntimeDependencies(); } /** - * Get runtime file patterns for the active format - * Returns null if the format uses npm dependencies instead of bundled files + * Get runtime file patterns for the active format. + * Used only for legacy zurg format until it can be refactored into a npm dependency. */ public getRuntimeFilePatterns(): { patterns: string[]; ignore?: string[] } | null { return this.format.getRuntimeFilePatterns(); } /** - * Helper to determine the format type from legacy noSerdeLayer config + * Helper to determine the format type from legacy noSerdeLayer config. Helps with backwards compatibility. */ public static resolveFormatType(options: { serializationFormat?: SerializationFormatType; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts index 9eaa04ac7411..f7171c387086 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/ZodFormat.ts @@ -11,7 +11,7 @@ import { SerializationFormat } from "../SerializationFormat"; export const ZOD_VERSION = "^3.23.0"; /** - * Base schema implementation for Zod format + * Base schema implementation for Zod format. */ interface ZodBaseSchema extends SerializationFormat.Schema { toExpression: () => ts.Expression; @@ -28,25 +28,41 @@ interface ZodBaseSchema extends SerializationFormat.Schema { /** * Helper to create a property access expression like `z.string()`. + * + * @example + * // createZodCall("string") generates: + * z.string() + * + * // createZodCall("literal", [ts.factory.createStringLiteral("foo")]) generates: + * z.literal("foo") */ function createZodCall(methodName: string, args: ts.Expression[] = []): ts.Expression { + // AST structure: CallExpression(PropertyAccessExpression(Identifier("z"), Identifier(methodName)), args) return ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier("z"), ts.factory.createIdentifier(methodName) ), - undefined, + undefined, // type arguments (generics) - not needed for Zod calls args ); } /** - * Helper to chain a method call on an expression + * Helper to chain a method call on an expression. + * + * @example + * // chainMethod(z.string(), "optional") generates: + * z.string().optional() + * + * // chainMethod(z.array(z.string()), "transform", [transformFn]) generates: + * z.array(z.string()).transform(transformFn) */ function chainMethod(expr: ts.Expression, methodName: string, args: ts.Expression[] = []): ts.Expression { + // AST structure: CallExpression(PropertyAccessExpression(expr, Identifier(methodName)), args) return ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression(expr, ts.factory.createIdentifier(methodName)), - undefined, + undefined, // type arguments args ); } @@ -85,7 +101,9 @@ export class ZodFormat implements SerializationFormat { // ==================== Schema Utilities ==================== - private getSchemaUtils(baseSchema: ZodBaseSchema): Omit { + private getSchemaUtils( + baseSchema: ZodBaseSchema + ): Omit { return { nullable: () => this.nullable(baseSchema), optional: () => this.optional(baseSchema), @@ -113,8 +131,14 @@ export class ZodFormat implements SerializationFormat { return parsed; }, transform: ({ transform, untransform }) => { - // Zod's transform only handles parse direction + // Zod's transform only handles parse direction (JSON → TypeScript) // We use .transform() for parse and store untransform separately + // + // Generated code example: + // z.string().transform((val) => new Date(val)) + // + // Note: `untransform` is used for the reverse direction (TypeScript → JSON) + // and is handled via toJsonExpression elsewhere const transformedExpr = chainMethod(baseSchema.toExpression(), "transform", [transform]); const newBase: ZodBaseSchema = { isOptional: baseSchema.isOptional, @@ -131,6 +155,13 @@ export class ZodFormat implements SerializationFormat { /** * Wrap schema to allow null values. + * + * @example + * // For z.string().nullable(), generates: + * z.string().nullable() + * + * // If inner schema has toJsonExpression (e.g., Date → ISO string), generates serialization: + * value != null ? value.toISOString() : null */ private nullable(schema: ZodBaseSchema): SerializationFormat.SchemaWithUtils { const baseSchema: ZodBaseSchema = { @@ -141,16 +172,17 @@ export class ZodFormat implements SerializationFormat { // Use != (loose inequality) to catch both null and undefined toJsonExpression: schema.toJsonExpression ? (parsed) => + // AST for: parsed != null ? innerTransform(parsed) : null ts.factory.createConditionalExpression( ts.factory.createBinaryExpression( parsed, - ts.SyntaxKind.ExclamationEqualsToken, // != (loose) + ts.SyntaxKind.ExclamationEqualsToken, // != (loose equality catches null & undefined) ts.factory.createNull() ), - undefined, - schema.toJsonExpression!(parsed), - undefined, - ts.factory.createNull() + undefined, // question token position + schema.toJsonExpression!(parsed), // whenTrue: apply inner transform + undefined, // colon token position + ts.factory.createNull() // whenFalse: return null ) : undefined }; @@ -224,24 +256,39 @@ export class ZodFormat implements SerializationFormat { // ==================== Object-like Utilities ==================== - private getObjectLikeUtils(_objectLike: ZodBaseSchema): Pick { + /** + * Creates utilities for object-like schemas (objects and unions). + * + * withParsedProperties adds computed properties to the parsed result using Zod's transform. + */ + private getObjectLikeUtils( + _objectLike: ZodBaseSchema + ): Pick { return { withParsedProperties: (additionalProperties: SerializationFormat.AdditionalProperty[]) => { // Zod doesn't have direct equivalent of withParsedProperties - // We use .transform() to add computed properties + // We use .transform() to add computed properties after parsing if (additionalProperties.length === 0) { return _objectLike as unknown as SerializationFormat.ObjectLikeSchema; } + // Generate AST for: + // schema.transform((parsed) => ({ + // ...parsed, + // computedProp1: computeValue1(parsed), + // computedProp2: computeValue2(parsed), + // })) const transformExpr = ts.factory.createArrowFunction( - undefined, - undefined, + undefined, // modifiers + undefined, // type parameters [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "parsed")], - undefined, + undefined, // return type ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), ts.factory.createObjectLiteralExpression( [ + // Spread original parsed properties: ...parsed ts.factory.createSpreadAssignment(ts.factory.createIdentifier("parsed")), + // Add computed properties: key: getValue(parsed) ...additionalProperties.map((prop) => { const value = prop.getValue({ getReferenceToParsed: () => ts.factory.createIdentifier("parsed") @@ -249,7 +296,7 @@ export class ZodFormat implements SerializationFormat { return ts.factory.createPropertyAssignment(prop.key, value); }) ], - true + true // multiLine ) ); @@ -271,7 +318,9 @@ export class ZodFormat implements SerializationFormat { // ==================== Object Utilities ==================== - private getObjectUtils(objectSchema: ZodBaseSchema): Pick { + private getObjectUtils( + objectSchema: ZodBaseSchema + ): Pick { return { extend: (extension: SerializationFormat.Schema) => { // Zod uses .merge() for extending objects @@ -308,6 +357,21 @@ export class ZodFormat implements SerializationFormat { // ==================== Object Schema Builders ==================== + /** + * Creates a Zod object schema from property definitions. + * + * Handles two complexities: + * 1. Key renaming: Fern allows different names for wire format (raw) vs TypeScript (parsed) + * 2. Nested serialization: Properties may need custom JSON serialization (e.g., Date → ISO string) + * + * @example + * // For properties [{key: {raw: "user_name", parsed: "userName"}, value: z.string()}] + * // Generates parsing schema: + * z.object({ user_name: z.string() }).transform((data) => ({ userName: data.user_name })) + * + * // And serialization (toJsonExpression): + * { user_name: parsed.userName } + */ public object = (properties: SerializationFormat.Property[]): SerializationFormat.ObjectSchema => { // Check if any property has toJsonExpression (needs serialization transform) const propsWithJsonTransform = properties.filter((p) => (p.value as ZodBaseSchema).toJsonExpression != null); @@ -379,12 +443,18 @@ export class ZodFormat implements SerializationFormat { }; // If any properties have different raw/parsed keys, wrap with transform for parsing + // This transforms from wire format keys to TypeScript keys after Zod parses if (hasKeyRenaming) { const transformedBase: ZodBaseSchema = { isOptional: false, isNullable: false, toExpression: () => { const inner = baseSchema.toExpression(); + // Generate AST for key renaming transform: + // z.object({ raw_key: z.string() }).transform((data) => ({ + // parsedKey: data.raw_key, + // anotherParsedKey: data.another_raw_key, + // })) const transformExpr = ts.factory.createArrowFunction( undefined, undefined, @@ -392,16 +462,17 @@ export class ZodFormat implements SerializationFormat { undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), ts.factory.createObjectLiteralExpression( + // Map each property: parsedKey: data.rawKey properties.map((prop) => ts.factory.createPropertyAssignment( - prop.key.parsed, + prop.key.parsed, // TypeScript property name ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier("data"), - prop.key.raw + prop.key.raw // Wire format property name ) ) ), - true + true // multiLine ) ); return chainMethod(inner, "transform", [transformExpr]); @@ -426,7 +497,9 @@ export class ZodFormat implements SerializationFormat { }; }; - public objectWithoutOptionalProperties = (properties: SerializationFormat.Property[]): SerializationFormat.ObjectSchema => { + public objectWithoutOptionalProperties = ( + properties: SerializationFormat.Property[] + ): SerializationFormat.ObjectSchema => { // In Zod, we use .strict() to disallow extra properties // For "without optional properties", we just create a regular object // The optionality is handled at the property level @@ -435,15 +508,30 @@ export class ZodFormat implements SerializationFormat { // ==================== Union Schema Builders ==================== - public union = ({ parsedDiscriminant, rawDiscriminant, singleUnionTypes }: SerializationFormat.UnionArgs): SerializationFormat.ObjectLikeSchema => { + /** + * Creates a discriminated union schema. + * + * @example + * // For a union with discriminant "type" and variants "dog" | "cat": + * z.discriminatedUnion("type", [ + * z.object({ type: z.literal("dog") }).merge(DogSchema as z.AnyZodObject), + * z.object({ type: z.literal("cat") }).merge(CatSchema as z.AnyZodObject), + * ]) + */ + public union = ({ + parsedDiscriminant, + rawDiscriminant, + singleUnionTypes + }: SerializationFormat.UnionArgs): SerializationFormat.ObjectLikeSchema => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, toExpression: () => { this.ensureZodImport(); - // Use z.discriminatedUnion for better performance + // Use z.discriminatedUnion for better performance than z.union + // Each variant is: z.object({ discriminant: z.literal("value") }).merge(propsSchema) const variants = singleUnionTypes.map((variant) => { - // Create an object schema with the discriminant + non-discriminant properties + // Create discriminant property: { type: z.literal("dog") } const discriminantProp = ts.factory.createPropertyAssignment( ts.factory.createStringLiteral(rawDiscriminant), this.zodCall("literal", [ts.factory.createStringLiteral(variant.discriminantValue)]) @@ -452,7 +540,7 @@ export class ZodFormat implements SerializationFormat { // Get the properties from the non-discriminant schema // We need to merge them with the discriminant // Cast to z.AnyZodObject because the imported schema is typed as z.ZodType - // but .merge() requires ZodObject + // but .merge() requires ZodObject - this is a TypeScript type assertion, not runtime const schemaWithCast = ts.factory.createAsExpression( variant.nonDiscriminantProperties.toExpression(), ts.factory.createTypeReferenceNode( @@ -460,6 +548,7 @@ export class ZodFormat implements SerializationFormat { undefined ) ); + // Combine: z.object({ type: z.literal("dog") }).merge(DogPropsSchema) return chainMethod( this.zodCall("object", [ts.factory.createObjectLiteralExpression([discriminantProp], false)]), "merge", @@ -467,6 +556,7 @@ export class ZodFormat implements SerializationFormat { ); }); + // Final: z.discriminatedUnion("type", [variant1, variant2, ...]) return this.zodCall("discriminatedUnion", [ ts.factory.createStringLiteral(rawDiscriminant), ts.factory.createArrayLiteralExpression(variants, true) @@ -539,18 +629,30 @@ export class ZodFormat implements SerializationFormat { // ==================== Collection Schema Builders ==================== + /** + * Creates an array/list schema. + * + * @example + * // Parsing schema: + * z.array(z.string()) + * + * // Serialization (toJsonExpression) for Date[] items: + * parsed.map((item) => item.toISOString()) + */ public list = (itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, toExpression: () => this.zodCall("array", [itemSchema.toExpression()]), // If items need serialization, map over array and serialize each item + // Generate: parsed.map((item) => itemTransform(item)) toJsonExpression: itemSchema.toJsonExpression ? (parsed) => ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression(parsed, "map"), undefined, [ + // Arrow function: (item) => itemTransform(item) ts.factory.createArrowFunction( undefined, undefined, @@ -570,22 +672,35 @@ export class ZodFormat implements SerializationFormat { }; }; + /** + * Creates a Set schema. + * + * JSON wire format uses arrays, so we transform: + * - Parsing: JSON array → JavaScript Set via z.array().transform(arr => new Set(arr)) + * - Serialization: JavaScript Set → JSON array via Array.from(set) + * + * @example + * // Parsing schema: + * z.array(z.string()).transform((arr) => new Set(arr)) + * + * // Serialization (toJsonExpression) for Set: + * Array.from(mySet).map((item) => item.toISOString()) + */ public set = (itemSchema: SerializationFormat.Schema): SerializationFormat.SchemaWithUtils => { - // JSON wire format uses arrays for sets - // Parsing: z.array().transform(arr => new Set(arr)) converts array → Set - // Serialization: Array.from() converts Set → Array (with item serialization if needed) const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, toExpression: () => { - // z.array(itemSchema).transform(arr => new Set(arr)) + // Generate: z.array(itemSchema).transform((arr) => new Set(arr)) const arraySchema = this.zodCall("array", [itemSchema.toExpression()]); + // Arrow function: (arr) => new Set(arr) const transformFn = ts.factory.createArrowFunction( undefined, undefined, [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "arr")], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + // new Set(arr) ts.factory.createNewExpression(ts.factory.createIdentifier("Set"), undefined, [ ts.factory.createIdentifier("arr") ]) @@ -593,12 +708,14 @@ export class ZodFormat implements SerializationFormat { return chainMethod(arraySchema, "transform", [transformFn]); }, // For JSON serialization, convert Set to Array - // If items need serialization, map over them: Array.from(set).map(item => item.json(item)) + // If items need serialization: Array.from(set).map(item => itemTransform(item)) // Otherwise just: Array.from(set) toJsonExpression: itemSchema.toJsonExpression ? (parsed) => + // Generate: Array.from(parsed).map((item) => itemTransform(item)) ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( + // Array.from(parsed) ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier("Array"), @@ -611,6 +728,7 @@ export class ZodFormat implements SerializationFormat { ), undefined, [ + // Arrow function: (item) => itemTransform(item) ts.factory.createArrowFunction( undefined, undefined, @@ -622,6 +740,7 @@ export class ZodFormat implements SerializationFormat { ] ) : (parsed) => + // Generate: Array.from(parsed) ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier("Array"), "from"), undefined, @@ -635,6 +754,16 @@ export class ZodFormat implements SerializationFormat { }; }; + /** + * Creates a Record/Map schema (key-value dictionary). + * + * @example + * // Parsing schema: + * z.record(z.string(), z.date()) + * + * // Serialization (toJsonExpression) for Record: + * Object.fromEntries(Object.entries(parsed).map(([k, v]) => [k, v.toISOString()])) + */ public record = ({ keySchema: _keySchema, valueSchema @@ -649,8 +778,10 @@ export class ZodFormat implements SerializationFormat { isNullable: false, toExpression: () => this.zodCall("record", [this.zodCall("string"), valueSchema.toExpression()]), // If values need serialization, transform each value in the record + // Pattern: Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, transform(v)])) toJsonExpression: valueSchema.toJsonExpression ? (parsed) => + // Generate: Object.fromEntries(Object.entries(parsed).map(([k, v]) => [k, valueTransform(v)])) ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier("Object"), @@ -658,8 +789,10 @@ export class ZodFormat implements SerializationFormat { ), undefined, [ + // Object.entries(parsed).map(...) ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( + // Object.entries(parsed) ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression( ts.factory.createIdentifier("Object"), @@ -672,10 +805,12 @@ export class ZodFormat implements SerializationFormat { ), undefined, [ + // Arrow function with destructuring: ([k, v]) => [k, valueTransform(v)] ts.factory.createArrowFunction( undefined, undefined, [ + // Destructuring parameter: [k, v] ts.factory.createParameterDeclaration( undefined, undefined, @@ -688,6 +823,7 @@ export class ZodFormat implements SerializationFormat { ], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + // Return [k, valueTransform(v)] ts.factory.createArrayLiteralExpression([ ts.factory.createIdentifier("k"), valueSchema.toJsonExpression!(ts.factory.createIdentifier("v")) @@ -807,28 +943,45 @@ export class ZodFormat implements SerializationFormat { }; }; + /** + * Creates a Date schema. + * + * JSON wire format uses ISO 8601 strings, so we transform: + * - Parsing: ISO string → JavaScript Date via z.string().transform(s => new Date(s)) + * - Serialization: JavaScript Date → ISO string via date.toISOString() + * + * @example + * // Parsing schema: + * z.string().transform((s) => new Date(s)) + * + * // Serialization (toJsonExpression): + * myDate.toISOString() + */ public date = (): SerializationFormat.SchemaWithUtils => { - // Zod's z.date() parses Date objects, but we need to parse ISO strings - // Use z.coerce.date() or z.string().transform() for ISO string parsing + // Zod's z.date() parses Date objects, but we need to parse ISO strings from JSON + // Use z.string().transform() for ISO string → Date parsing const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, toExpression: () => { - // Use z.string() with transform to parse ISO strings to Date + // Generate: z.string().transform((s) => new Date(s)) return chainMethod(this.zodCall("string"), "transform", [ + // Arrow function: (s) => new Date(s) ts.factory.createArrowFunction( undefined, undefined, [ts.factory.createParameterDeclaration(undefined, undefined, undefined, "s")], undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + // new Date(s) ts.factory.createNewExpression(ts.factory.createIdentifier("Date"), undefined, [ ts.factory.createIdentifier("s") ]) ) ]); }, - // For JSON serialization, convert Date back to ISO string: date.toISOString() + // For JSON serialization, convert Date back to ISO string + // Generate: parsed.toISOString() toJsonExpression: (parsed) => ts.factory.createCallExpression( ts.factory.createPropertyAccessExpression(parsed, "toISOString"), @@ -934,11 +1087,27 @@ export class ZodFormat implements SerializationFormat { // ==================== Type Utilities ==================== + /** + * Type utilities for generating schema type references. + * + * In Zod format, each schema file exports a wrapper object: + * ```typescript + * export const MyTypeSchema = { + * _schema: z.object({ ... }), + * parse: (raw: unknown): MyType => _schema.parse(raw), + * json: (parsed: MyType): MyTypeRaw => ({ ... }) + * } + * ``` + * + * These utilities generate the TypeScript types for such wrapper objects. + */ public Schema = { + /** + * Generates type: { _schema: z.ZodTypeAny; parse: (raw: unknown) => Parsed; json: (parsed: Parsed) => Raw } + */ _getReferenceToType: ({ rawShape, parsedShape }: { rawShape: ts.TypeNode; parsedShape: ts.TypeNode }) => { - // Generate a type literal that matches the wrapper object structure: - // { _schema: z.ZodTypeAny; parse: (raw: unknown) => Parsed; json: (parsed: Parsed) => Raw } this.ensureZodImport(); + // Generate a TypeLiteralNode with three properties: _schema, parse, json return ts.factory.createTypeLiteralNode([ // _schema: z.ZodTypeAny ts.factory.createPropertySignature( @@ -993,14 +1162,28 @@ export class ZodFormat implements SerializationFormat { ]); }, - _fromExpression: (expression: ts.Expression, opts?: { isObject: boolean }): SerializationFormat.SchemaWithUtils => { - // For Zod format, schemas are wrapped with { _schema, parse, json } structure - // When used in schema composition (z.array, z.record, etc.), we need the actual Zod schema - // When serializing, we call the wrapper's .json() method + /** + * Creates a schema from an imported schema reference expression. + * + * In Zod format, schemas are wrapped in objects with { _schema, parse, json } structure: + * - _schema: The actual Zod schema (z.object, z.string, etc.) + * - parse: Function to parse JSON → TypeScript type + * - json: Function to serialize TypeScript type → JSON + * + * @example + * // For an imported schema reference `UserSchema`: + * // toExpression() returns: UserSchema._schema (for use in z.array(UserSchema._schema)) + * // toJsonExpression(parsed) returns: UserSchema.json(parsed) + */ + _fromExpression: ( + expression: ts.Expression, + opts?: { isObject: boolean } + ): SerializationFormat.SchemaWithUtils => { const baseSchema: ZodBaseSchema = { isOptional: false, isNullable: false, // Return expression._schema for use in schema composition (z.array(), z.record(), etc.) + // This accesses the raw Zod schema from the wrapper object toExpression: () => ts.factory.createPropertyAccessExpression(expression, "_schema"), // Generate: schemaRef.json(parsed) for serialization // This calls the json method on the wrapper object generated in writeSchemaToFile @@ -1025,6 +1208,19 @@ export class ZodFormat implements SerializationFormat { }; }, + /** + * Generates if/else statements for handling Zod's safeParse result. + * + * Zod's safeParse returns: { success: boolean; data?: T; error?: ZodError } + * + * @example + * // Generated code: + * if (result.success) { + * // valid branch: use result.data + * } else { + * // invalid branch: use result.error + * } + */ _visitMaybeValid: ( referenceToMaybeValid: ts.Expression, visitor: { @@ -1032,18 +1228,20 @@ export class ZodFormat implements SerializationFormat { invalid: (referenceToErrors: ts.Expression) => ts.Statement[]; } ): ts.Statement[] => { - // For Zod, safeParse returns { success: boolean, data?, error? } - // We generate: if (result.success) { valid(result.data) } else { invalid(result.error) } + // Generate: if (result.success) { ...validStatements } else { ...invalidStatements } return [ ts.factory.createIfStatement( + // Condition: result.success ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "success"), + // Then block: visitor.valid(result.data) ts.factory.createBlock( visitor.valid(ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "data")), - true + true // multiLine ), + // Else block: visitor.invalid(result.error) ts.factory.createBlock( visitor.invalid(ts.factory.createPropertyAccessExpression(referenceToMaybeValid, "error")), - true + true // multiLine ) ) ]; From 3a508a56fd87b553823fe1932b3eb29c94bd10ea Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 12:36:43 -0500 Subject: [PATCH 65/71] fixed comment --- .../commons/src/serialization-pipeline/SerializationPipeline.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts index 2e42a8cb8548..665add231eb6 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/SerializationPipeline.ts @@ -95,6 +95,7 @@ export class SerializationPipeline { /** * Get runtime dependencies required by the active format. * Note: only used for legacy zurg format until it can be refactored into a npm dependency. + */ public getRuntimeDependencies(): Record { return this.format.getRuntimeDependencies(); } From a0e84b139340fd90acdb19dda0355f38a6a93c49 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 12:42:30 -0500 Subject: [PATCH 66/71] final tests --- .../serde-layer-none/.fern/metadata.json | 8 + .../serde-layer-none/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-none/.gitignore | 3 + .../serde-layer-none/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-none/README.md | 241 ++ .../exhaustive/serde-layer-none/biome.json | 74 + .../exhaustive/serde-layer-none/package.json | 66 + .../serde-layer-none/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-none/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-none/snippet.json | 544 ++++ .../serde-layer-none/src/BaseClient.ts | 82 + .../exhaustive/serde-layer-none/src/Client.ts | 48 + .../serde-layer-none/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 458 +++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 171 + .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 80 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 334 ++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 522 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 522 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 535 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 80 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 84 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 210 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 110 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 89 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 126 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 93 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 35 + .../serde-layer-none/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-none/src/core/auth/index.ts | 5 + .../serde-layer-none/src/core/base64.ts | 27 + .../serde-layer-none/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-none/src/core/headers.ts | 35 + .../serde-layer-none/src/core/index.ts | 6 + .../serde-layer-none/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-none/src/core/url/index.ts | 3 + .../serde-layer-none/src/core/url/join.ts | 79 + .../serde-layer-none/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-none/src/errors/index.ts | 2 + .../serde-layer-none/src/exports.ts | 1 + .../exhaustive/serde-layer-none/src/index.ts | 5 + .../serde-layer-none/src/version.ts | 1 + .../serde-layer-none/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../serde-layer-none/tests/setup.ts | 80 + .../serde-layer-none/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/url/join.test.ts | 284 ++ .../tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-none/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-none/tsconfig.base.json | 18 + .../serde-layer-none/tsconfig.cjs.json | 9 + .../serde-layer-none/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-none/tsconfig.json | 3 + .../serde-layer-none/vitest.config.mts | 28 + .../serde-layer-zod/.fern/metadata.json | 8 + .../serde-layer-zod/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-zod/.gitignore | 3 + .../serde-layer-zod/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-zod/README.md | 241 ++ .../exhaustive/serde-layer-zod/biome.json | 74 + .../exhaustive/serde-layer-zod/package.json | 80 + .../serde-layer-zod/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-zod/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-zod/snippet.json | 544 ++++ .../serde-layer-zod/src/BaseClient.ts | 82 + .../exhaustive/serde-layer-zod/src/Client.ts | 48 + .../serde-layer-zod/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 477 +++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 172 + .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 84 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 341 ++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 523 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 535 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 563 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 84 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 85 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 223 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 111 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 93 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 130 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 90 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 35 + .../serde-layer-zod/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-zod/src/core/auth/index.ts | 5 + .../serde-layer-zod/src/core/base64.ts | 27 + .../serde-layer-zod/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../serde-layer-zod/src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-zod/src/core/headers.ts | 35 + .../serde-layer-zod/src/core/index.ts | 6 + .../serde-layer-zod/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../serde-layer-zod/src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../serde-layer-zod/src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-zod/src/core/url/index.ts | 3 + .../serde-layer-zod/src/core/url/join.ts | 79 + .../serde-layer-zod/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-zod/src/errors/index.ts | 2 + .../exhaustive/serde-layer-zod/src/exports.ts | 1 + .../exhaustive/serde-layer-zod/src/index.ts | 6 + .../src/serialization/index.ts | 1 + .../resources/endpoints/index.ts | 1 + .../client/getAndReturnListOfObjects.ts | 46 + .../client/getAndReturnListOfPrimitives.ts | 34 + .../client/getAndReturnMapOfPrimToObject.ts | 47 + .../client/getAndReturnMapPrimToPrim.ts | 36 + .../container/client/getAndReturnOptional.ts | 46 + .../client/getAndReturnSetOfObjects.ts | 46 + .../client/getAndReturnSetOfPrimitives.ts | 36 + .../resources/container/client/index.ts | 7 + .../endpoints/resources/container/index.ts | 1 + .../resources/httpMethods/client/index.ts | 2 + .../httpMethods/client/testDelete.ts | 19 + .../resources/httpMethods/client/testGet.ts | 19 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 8 + ...tAndReturnNestedWithRequiredFieldAsList.ts | 26 + .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../params/client/getWithInlinePath.ts | 19 + .../resources/params/client/getWithPath.ts | 19 + .../resources/params/client/index.ts | 4 + .../params/client/modifyWithInlinePath.ts | 34 + .../resources/params/client/modifyWithPath.ts | 34 + .../endpoints/resources/params/index.ts | 1 + .../primitive/client/getAndReturnBase64.ts | 34 + .../primitive/client/getAndReturnBool.ts | 34 + .../primitive/client/getAndReturnDate.ts | 34 + .../primitive/client/getAndReturnDatetime.ts | 34 + .../primitive/client/getAndReturnDouble.ts | 34 + .../primitive/client/getAndReturnInt.ts | 34 + .../primitive/client/getAndReturnLong.ts | 34 + .../primitive/client/getAndReturnString.ts | 34 + .../primitive/client/getAndReturnUuid.ts | 34 + .../resources/primitive/client/index.ts | 9 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/index.ts | 1 + .../resources/put/types/ErrorCategory.ts | 20 + .../resources/put/types/ErrorCode.ts | 43 + .../endpoints/resources/put/types/Error_.ts | 38 + .../resources/put/types/PutResponse.ts | 33 + .../endpoints/resources/put/types/index.ts | 4 + .../endpoints/resources/urls/client/index.ts | 4 + .../resources/urls/client/noEndingSlash.ts | 19 + .../resources/urls/client/withEndingSlash.ts | 19 + .../resources/urls/client/withMixedCase.ts | 19 + .../resources/urls/client/withUnderscores.ts | 19 + .../endpoints/resources/urls/index.ts | 1 + .../resources/generalErrors/index.ts | 1 + .../types/BadObjectRequestInfo.ts | 24 + .../resources/generalErrors/types/index.ts | 1 + .../src/serialization/resources/index.ts | 9 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 40 + .../inlinedRequests/client/requests/index.ts | 1 + .../resources/inlinedRequests/index.ts | 1 + .../resources/noAuth/client/index.ts | 1 + .../resources/noAuth/client/postWithNoAuth.ts | 19 + .../serialization/resources/noAuth/index.ts | 1 + .../resources/noReqBody/client/index.ts | 1 + .../noReqBody/client/postWithNoRequestBody.ts | 19 + .../resources/noReqBody/index.ts | 1 + .../client/getWithCustomHeader.ts | 19 + .../resources/reqWithHeaders/client/index.ts | 1 + .../resources/reqWithHeaders/index.ts | 1 + .../serialization/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 24 + .../types/resources/docs/types/index.ts | 1 + .../resources/types/resources/enum/index.ts | 1 + .../resources/enum/types/WeatherReport.ts | 20 + .../types/resources/enum/types/index.ts | 1 + .../resources/types/resources/index.ts | 8 + .../resources/types/resources/object/index.ts | 1 + .../resources/object/types/DoubleOptional.ts | 33 + .../types/NestedObjectWithOptionalField.ts | 44 + .../types/NestedObjectWithRequiredField.ts | 39 + .../object/types/ObjectWithMapOfMap.ts | 24 + .../object/types/ObjectWithOptionalField.ts | 74 + .../object/types/ObjectWithRequiredField.ts | 25 + .../resources/object/types/OptionalAlias.ts | 20 + .../types/resources/object/types/index.ts | 7 + .../resources/types/resources/union/index.ts | 1 + .../types/resources/union/types/Animal.ts | 35 + .../types/resources/union/types/Cat.ts | 26 + .../types/resources/union/types/Dog.ts | 26 + .../types/resources/union/types/index.ts | 3 + .../exhaustive/serde-layer-zod/src/version.ts | 1 + .../serde-layer-zod/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../exhaustive/serde-layer-zod/tests/setup.ts | 80 + .../serde-layer-zod/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../serde-layer-zod/tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/url/join.test.ts | 284 ++ .../serde-layer-zod/tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-zod/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../serde-layer-zod/tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-zod/tsconfig.base.json | 18 + .../serde-layer-zod/tsconfig.cjs.json | 9 + .../serde-layer-zod/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-zod/tsconfig.json | 3 + .../serde-layer-zod/vitest.config.mts | 28 + .../serde-layer-zurg/.fern/metadata.json | 8 + .../serde-layer-zurg/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-zurg/.gitignore | 3 + .../serde-layer-zurg/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-zurg/README.md | 241 ++ .../exhaustive/serde-layer-zurg/biome.json | 74 + .../exhaustive/serde-layer-zurg/package.json | 78 + .../serde-layer-zurg/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-zurg/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-zurg/snippet.json | 544 ++++ .../serde-layer-zurg/src/BaseClient.ts | 82 + .../exhaustive/serde-layer-zurg/src/Client.ts | 48 + .../serde-layer-zurg/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 543 ++++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 178 ++ .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 93 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 380 +++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 577 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 565 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 644 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 90 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 97 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 247 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 126 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 105 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 142 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 93 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 35 + .../serde-layer-zurg/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-zurg/src/core/auth/index.ts | 5 + .../serde-layer-zurg/src/core/base64.ts | 27 + .../serde-layer-zurg/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-zurg/src/core/headers.ts | 35 + .../serde-layer-zurg/src/core/index.ts | 7 + .../serde-layer-zurg/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/schemas/Schema.ts | 103 + .../core/schemas/builders/bigint/bigint.ts | 55 + .../src/core/schemas/builders/bigint/index.ts | 1 + .../src/core/schemas/builders/date/date.ts | 65 + .../src/core/schemas/builders/date/index.ts | 1 + .../src/core/schemas/builders/enum/enum.ts | 43 + .../src/core/schemas/builders/enum/index.ts | 1 + .../src/core/schemas/builders/index.ts | 14 + .../src/core/schemas/builders/lazy/index.ts | 3 + .../src/core/schemas/builders/lazy/lazy.ts | 32 + .../core/schemas/builders/lazy/lazyObject.ts | 20 + .../src/core/schemas/builders/list/index.ts | 1 + .../src/core/schemas/builders/list/list.ts | 73 + .../builders/literals/booleanLiteral.ts | 29 + .../core/schemas/builders/literals/index.ts | 2 + .../builders/literals/stringLiteral.ts | 29 + .../object-like/getObjectLikeUtils.ts | 79 + .../schemas/builders/object-like/index.ts | 2 + .../schemas/builders/object-like/types.ts | 13 + .../src/core/schemas/builders/object/index.ts | 22 + .../core/schemas/builders/object/object.ts | 382 +++ .../object/objectWithoutOptionalProperties.ts | 23 + .../core/schemas/builders/object/property.ts | 23 + .../src/core/schemas/builders/object/types.ts | 73 + .../core/schemas/builders/primitives/any.ts | 7 + .../schemas/builders/primitives/boolean.ts | 25 + .../core/schemas/builders/primitives/index.ts | 6 + .../core/schemas/builders/primitives/never.ts | 15 + .../schemas/builders/primitives/number.ts | 25 + .../schemas/builders/primitives/string.ts | 25 + .../schemas/builders/primitives/unknown.ts | 7 + .../src/core/schemas/builders/record/index.ts | 2 + .../core/schemas/builders/record/record.ts | 129 + .../src/core/schemas/builders/record/types.ts | 17 + .../builders/schema-utils/JsonError.ts | 9 + .../builders/schema-utils/ParseError.ts | 9 + .../builders/schema-utils/getSchemaUtils.ts | 181 ++ .../schemas/builders/schema-utils/index.ts | 4 + .../schema-utils/stringifyValidationErrors.ts | 8 + .../src/core/schemas/builders/set/index.ts | 1 + .../src/core/schemas/builders/set/set.ts | 43 + .../builders/undiscriminated-union/index.ts | 6 + .../builders/undiscriminated-union/types.ts | 10 + .../undiscriminatedUnion.ts | 67 + .../schemas/builders/union/discriminant.ts | 14 + .../src/core/schemas/builders/union/index.ts | 10 + .../src/core/schemas/builders/union/types.ts | 26 + .../src/core/schemas/builders/union/union.ts | 176 ++ .../src/core/schemas/index.ts | 2 + .../src/core/schemas/utils/MaybePromise.ts | 1 + .../addQuestionMarksToNullableProperties.ts | 9 + .../utils/createIdentitySchemaCreator.ts | 21 + .../src/core/schemas/utils/entries.ts | 3 + .../src/core/schemas/utils/filterObject.ts | 13 + .../utils/getErrorMessageForIncorrectType.ts | 25 + .../src/core/schemas/utils/isPlainObject.ts | 17 + .../src/core/schemas/utils/keys.ts | 3 + .../core/schemas/utils/maybeSkipValidation.ts | 38 + .../src/core/schemas/utils/partition.ts | 12 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-zurg/src/core/url/index.ts | 3 + .../serde-layer-zurg/src/core/url/join.ts | 79 + .../serde-layer-zurg/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-zurg/src/errors/index.ts | 2 + .../serde-layer-zurg/src/exports.ts | 1 + .../exhaustive/serde-layer-zurg/src/index.ts | 6 + .../src/serialization/index.ts | 1 + .../resources/endpoints/index.ts | 1 + .../client/getAndReturnListOfObjects.ts | 24 + .../client/getAndReturnListOfPrimitives.ts | 22 + .../client/getAndReturnMapOfPrimToObject.ts | 24 + .../client/getAndReturnMapPrimToPrim.ts | 22 + .../container/client/getAndReturnOptional.ts | 24 + .../client/getAndReturnSetOfObjects.ts | 24 + .../client/getAndReturnSetOfPrimitives.ts | 22 + .../resources/container/client/index.ts | 7 + .../endpoints/resources/container/index.ts | 1 + .../resources/httpMethods/client/index.ts | 2 + .../httpMethods/client/testDelete.ts | 11 + .../resources/httpMethods/client/testGet.ts | 11 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 8 + ...tAndReturnNestedWithRequiredFieldAsList.ts | 15 + .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../params/client/getWithInlinePath.ts | 11 + .../resources/params/client/getWithPath.ts | 11 + .../resources/params/client/index.ts | 4 + .../params/client/modifyWithInlinePath.ts | 20 + .../resources/params/client/modifyWithPath.ts | 18 + .../endpoints/resources/params/index.ts | 1 + .../primitive/client/getAndReturnBase64.ts | 22 + .../primitive/client/getAndReturnBool.ts | 20 + .../primitive/client/getAndReturnDate.ts | 20 + .../primitive/client/getAndReturnDatetime.ts | 22 + .../primitive/client/getAndReturnDouble.ts | 22 + .../primitive/client/getAndReturnInt.ts | 18 + .../primitive/client/getAndReturnLong.ts | 20 + .../primitive/client/getAndReturnString.ts | 22 + .../primitive/client/getAndReturnUuid.ts | 20 + .../resources/primitive/client/index.ts | 9 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/index.ts | 1 + .../resources/put/types/ErrorCategory.ts | 14 + .../resources/put/types/ErrorCode.ts | 37 + .../endpoints/resources/put/types/Error_.ts | 26 + .../resources/put/types/PutResponse.ts | 19 + .../endpoints/resources/put/types/index.ts | 4 + .../endpoints/resources/urls/client/index.ts | 4 + .../resources/urls/client/noEndingSlash.ts | 11 + .../resources/urls/client/withEndingSlash.ts | 11 + .../resources/urls/client/withMixedCase.ts | 11 + .../resources/urls/client/withUnderscores.ts | 11 + .../endpoints/resources/urls/index.ts | 1 + .../resources/generalErrors/index.ts | 1 + .../types/BadObjectRequestInfo.ts | 18 + .../resources/generalErrors/types/index.ts | 1 + .../src/serialization/resources/index.ts | 9 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 23 + .../inlinedRequests/client/requests/index.ts | 1 + .../resources/inlinedRequests/index.ts | 1 + .../resources/noAuth/client/index.ts | 1 + .../resources/noAuth/client/postWithNoAuth.ts | 11 + .../serialization/resources/noAuth/index.ts | 1 + .../resources/noReqBody/client/index.ts | 1 + .../noReqBody/client/postWithNoRequestBody.ts | 11 + .../resources/noReqBody/index.ts | 1 + .../client/getWithCustomHeader.ts | 11 + .../resources/reqWithHeaders/client/index.ts | 1 + .../resources/reqWithHeaders/index.ts | 1 + .../serialization/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 18 + .../types/resources/docs/types/index.ts | 1 + .../resources/types/resources/enum/index.ts | 1 + .../resources/enum/types/WeatherReport.ts | 14 + .../types/resources/enum/types/index.ts | 1 + .../resources/types/resources/index.ts | 8 + .../resources/types/resources/object/index.ts | 1 + .../resources/object/types/DoubleOptional.ts | 19 + .../types/NestedObjectWithOptionalField.ts | 21 + .../types/NestedObjectWithRequiredField.ts | 21 + .../object/types/ObjectWithMapOfMap.ts | 21 + .../object/types/ObjectWithOptionalField.ts | 42 + .../object/types/ObjectWithRequiredField.ts | 18 + .../resources/object/types/OptionalAlias.ts | 14 + .../types/resources/object/types/index.ts | 7 + .../resources/types/resources/union/index.ts | 1 + .../types/resources/union/types/Animal.ts | 30 + .../types/resources/union/types/Cat.ts | 18 + .../types/resources/union/types/Dog.ts | 18 + .../types/resources/union/types/index.ts | 3 + .../serde-layer-zurg/src/version.ts | 1 + .../serde-layer-zurg/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../serde-layer-zurg/tests/setup.ts | 80 + .../serde-layer-zurg/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/schemas/bigint/bigint.test.ts | 46 + .../tests/unit/schemas/date/date.test.ts | 31 + .../tests/unit/schemas/enum/enum.test.ts | 30 + .../tests/unit/schemas/lazy/lazy.test.ts | 57 + .../unit/schemas/lazy/lazyObject.test.ts | 18 + .../tests/unit/schemas/lazy/recursive/a.ts | 7 + .../tests/unit/schemas/lazy/recursive/b.ts | 8 + .../tests/unit/schemas/list/list.test.ts | 41 + .../schemas/literals/stringLiteral.test.ts | 21 + .../object-like/withParsedProperties.test.ts | 57 + .../tests/unit/schemas/object/extend.test.ts | 89 + .../tests/unit/schemas/object/object.test.ts | 255 ++ .../objectWithoutOptionalProperties.test.ts | 21 + .../unit/schemas/object/passthrough.test.ts | 87 + .../tests/unit/schemas/primitives/any.test.ts | 6 + .../unit/schemas/primitives/boolean.test.ts | 14 + .../unit/schemas/primitives/never.test.ts | 54 + .../unit/schemas/primitives/number.test.ts | 14 + .../unit/schemas/primitives/string.test.ts | 14 + .../unit/schemas/primitives/unknown.test.ts | 6 + .../tests/unit/schemas/record/record.test.ts | 34 + .../schema-utils/getSchemaUtils.test.ts | 83 + .../tests/unit/schemas/schema.test.ts | 78 + .../tests/unit/schemas/set/set.test.ts | 48 + .../tests/unit/schemas/skipValidation.test.ts | 44 + .../undiscriminatedUnion.test.ts | 44 + .../tests/unit/schemas/union/union.test.ts | 113 + .../tests/unit/schemas/utils/itSchema.ts | 78 + .../tests/unit/schemas/utils/itValidate.ts | 56 + .../tests/unit/url/join.test.ts | 284 ++ .../tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-zurg/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-zurg/tsconfig.base.json | 18 + .../serde-layer-zurg/tsconfig.cjs.json | 9 + .../serde-layer-zurg/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-zurg/tsconfig.json | 3 + .../serde-layer-zurg/vitest.config.mts | 28 + 898 files changed, 56602 insertions(+) create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json new file mode 100644 index 000000000000..48f29b85d5d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "none" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/README.md b/seed/ts-sdk/exhaustive/serde-layer-none/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +

+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/biome.json b/seed/ts-sdk/exhaustive/serde-layer-none/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/package.json b/seed/ts-sdk/exhaustive/serde-layer-none/package.json new file mode 100644 index 000000000000..d78462fbefd6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/package.json @@ -0,0 +1,66 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": {}, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/reference.md b/seed/ts-sdk/exhaustive/serde-layer-none/reference.md new file mode 100644 index 000000000000..c7d4e874e8a2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json new file mode 100644 index 000000000000..33399dc5484e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives([\"string\"]);\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(\"2024-01-15T09:30:00Z\");\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n \"X-TEST-SERVICE-HEADER\": \"X-TEST-SERVICE-HEADER\",\n \"X-TEST-ENDPOINT-HEADER\": \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts new file mode 100644 index 000000000000..f28de2b4c43c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts @@ -0,0 +1,82 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export interface BaseClientOptions { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + token?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts new file mode 100644 index 000000000000..d5ca904d9544 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..b124def3d861 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export interface Options extends BaseClientOptions {} +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..dd50598a34d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,458 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string[], rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]) + */ + public getAndReturnSetOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string[], rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as Record, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as Record, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request != null ? request : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField | undefined, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..0dcd19c50614 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,171 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..f15447a67ae8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,80 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as SeedExhaustive.types.WeatherReport, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..9383ef15a189 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,334 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as boolean, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..3a67887dbd74 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,522 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithRequiredField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithMapOfMap, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.NestedObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..890bfd8293e6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,522 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: _body, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..98244a13252b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,535 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; + +export declare namespace PrimitiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as number, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as number, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as number, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as boolean, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z") + */ + public getAndReturnDatetime( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..5c4e4edf4e39 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,80 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as SeedExhaustive.endpoints.PutResponse, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..fe75d063f585 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,84 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as SeedExhaustive.types.Animal, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..955bb036344f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,210 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; + +export declare namespace UrlsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..b2a084be5dbd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,110 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + _response.error.body as SeedExhaustive.BadObjectRequestInfo, + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..b20679ee1c90 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * NestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: "2024-01-15T09:30:00Z", + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: ["set"], + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + NestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..cefce5ee90bd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,89 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as boolean, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + _response.error.body as SeedExhaustive.BadObjectRequestInfo, + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..dbf262403321 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,126 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: _response.body as string, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..29b39fb91fdd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + body: _body, + } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: _body, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..4b2e6816729b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + "X-TEST-SERVICE-HEADER": string; + "X-TEST-ENDPOINT-HEADER": string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..b7fddd5d2018 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + NestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..ae3312eae621 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + NestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..47615d58f541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: string; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: string[]; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..b556b3f7bd94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface Options { + token?: core.Supplier; + } +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts new file mode 100644 index 000000000000..92290bfadcac --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts @@ -0,0 +1,6 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts new file mode 100644 index 000000000000..9ebdde6391a5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts @@ -0,0 +1,5 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..5a3250cc64ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); + expect(response).toEqual(["string"]); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..f6336d860bd7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..aab4d5b86ec7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..8169463c8368 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..7797a100db7b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); + expect(response).toEqual("2024-01-15T09:30:00Z"); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..74529a1788fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..7aec8c7699f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a2295047e422 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", + "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json new file mode 100644 index 000000000000..4a881bff00a8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "zod" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/README.md b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +
+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/package.json b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json new file mode 100644 index 000000000000..20397bfc4323 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json @@ -0,0 +1,80 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./serialization": { + "types": "./dist/cjs/serialization/index.d.ts", + "import": { + "types": "./dist/esm/serialization/index.d.mts", + "default": "./dist/esm/serialization/index.mjs" + }, + "require": { + "types": "./dist/cjs/serialization/index.d.ts", + "default": "./dist/cjs/serialization/index.js" + }, + "default": "./dist/cjs/serialization/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": { + "zod": "^3.23.0" + }, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md new file mode 100644 index 000000000000..b571afcab9fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Set` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Date` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json new file mode 100644 index 000000000000..875b76c4bb57 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts new file mode 100644 index 000000000000..f28de2b4c43c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts @@ -0,0 +1,82 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export interface BaseClientOptions { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + token?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts new file mode 100644 index 000000000000..d5ca904d9544 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..b124def3d861 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export interface Options extends BaseClientOptions {} +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..65bf08dc772d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,477 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response._schema.parse( + _response.body, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfObjects.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfObjects.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {Set} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) + */ + public getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response._schema.parse( + _response.body, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfObjects.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response._schema.parse( + _response.body, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: + request != null + ? serializers.endpoints.container.getAndReturnOptional.Request.json(request) + : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnOptional.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..920acc7a8a7e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,172 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..befd4eb2fe7b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,84 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.WeatherReport.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.WeatherReport._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..26cd0aef2380 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,341 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testGet.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testDelete.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..977107bd4917 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,523 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithRequiredField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithMapOfMap.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithMapOfMap._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..3a81c10c657f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,535 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithPath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithInlinePath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithPath.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithPath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithInlinePath.Request.json(_body), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithInlinePath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..60ef815dc211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,563 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace PrimitiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnString.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnString.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnInt.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnInt.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnLong.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnLong.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDouble.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDouble.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBool.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBool.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {Date} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) + */ + public getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDatetime.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDatetime.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDate.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDate.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnUuid.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnUuid.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBase64.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBase64.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..6a89a9bc090e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,84 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.PutResponse._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..95f732c131d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,85 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.Animal.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: serializers.types.Animal._schema.parse(_response.body), rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..c9401e289700 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,223 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace UrlsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withMixedCase.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.noEndingSlash.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withEndingSlash.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withUnderscores.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..dcf128fe3b72 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,111 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.PostWithObjectBody.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo._schema.parse(_response.error.body), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..15d3f75bc67d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..282d68aa3b53 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noAuth.postWithNoAuth.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo._schema.parse(_response.error.body), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..6eea09ec1f67 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,130 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noReqBody.postWithNoRequestBody.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..5cf55b3b4c66 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,90 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.reqWithHeaders.getWithCustomHeader.Request.json(_body), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..b7fce3790bf5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + xTestServiceHeader: string; + xTestEndpointHeader: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..324bb2e73908 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..322dcfbd5c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..2e6b3811b575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: Date; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: Set; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..b556b3f7bd94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface Options { + token?: core.Supplier; + } +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts new file mode 100644 index 000000000000..92290bfadcac --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts @@ -0,0 +1,6 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts new file mode 100644 index 000000000000..9f0bdd34e0d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts @@ -0,0 +1,6 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; +export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts new file mode 100644 index 000000000000..3e5dc038a0ae --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -0,0 +1,46 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = z.array(ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, +}; + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +const _Response_Schema = z.array(ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, +}; + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts new file mode 100644 index 000000000000..d5c3cd1ae608 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.array(z.string()); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string[]; + json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string[], + json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string[]; +} + +const _Response_Schema = z.array(z.string()); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string[]; + json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string[], + json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts new file mode 100644 index 000000000000..000bdb1a9f9a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -0,0 +1,47 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = z.record(z.string(), ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: ( + parsed: Record, + ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, + json: (parsed: Record) => + Object.fromEntries( + Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), + ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, +}; + +export declare namespace Request { + export type Raw = Record; +} + +const _Response_Schema = z.record(z.string(), ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: ( + parsed: Record, + ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => + _Response_Schema.parse(raw) as Record, + json: (parsed: Record) => + Object.fromEntries( + Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), + ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, +}; + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts new file mode 100644 index 000000000000..f5db8ef1efae --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -0,0 +1,36 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.record(z.string(), z.string()); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, + json: (parsed: Record) => + parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, +}; + +export declare namespace Request { + export type Raw = Record; +} + +const _Response_Schema = z.record(z.string(), z.string()); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Record, + json: (parsed: Record) => + parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, +}; + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts new file mode 100644 index 000000000000..fb36dd017dc2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -0,0 +1,46 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = ObjectWithRequiredField._schema.optional(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, + ) => serializers.endpoints.container.getAndReturnOptional.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => + parsed != null + ? ObjectWithRequiredField.json(parsed) + : (parsed as serializers.endpoints.container.getAndReturnOptional.Request.Raw), +}; + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} + +const _Response_Schema = ObjectWithRequiredField._schema.optional(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, + ) => serializers.endpoints.container.getAndReturnOptional.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => + parsed != null + ? ObjectWithRequiredField.json(parsed) + : (parsed as serializers.endpoints.container.getAndReturnOptional.Response.Raw), +}; + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts new file mode 100644 index 000000000000..0c85a32c4a09 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -0,0 +1,46 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = z.array(ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, +}; + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +const _Response_Schema = z.array(ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, +}; + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts new file mode 100644 index 000000000000..f80628d1136e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -0,0 +1,36 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.array(z.string()).transform((arr) => new Set(arr)); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Set; + json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Set, + json: (parsed: Set) => + Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string[]; +} + +const _Response_Schema = z.array(z.string()).transform((arr) => new Set(arr)); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Set; + json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Set, + json: (parsed: Set) => + Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..1972f5b270f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1,7 @@ +export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; +export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; +export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; +export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; +export * as getAndReturnOptional from "./getAndReturnOptional.js"; +export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; +export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..e053119b972c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1,2 @@ +export * as testDelete from "./testDelete.js"; +export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts new file mode 100644 index 000000000000..f770bb3d0434 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.httpMethods.testDelete.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.httpMethods.testDelete.Response.Raw, +}; + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts new file mode 100644 index 000000000000..ee29c6d64e90 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.httpMethods.testGet.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.httpMethods.testGet.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..cd7e640937da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts @@ -0,0 +1,8 @@ +export * as container from "./container/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts new file mode 100644 index 000000000000..2ffc5ec115c4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; + +const _Request_Schema = z.array(NestedObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithRequiredField[], + ) => serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField[]) => + parsed.map((item) => + NestedObjectWithRequiredField.json(item), + ) as serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, +}; + +export declare namespace Request { + export type Raw = NestedObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..d00c4c582910 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts new file mode 100644 index 000000000000..62d66628879c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.getWithInlinePath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.getWithInlinePath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts new file mode 100644 index 000000000000..28e0a88b1335 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.getWithPath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.getWithPath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..b30603cae602 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1,4 @@ +export * as getWithInlinePath from "./getWithInlinePath.js"; +export * as getWithPath from "./getWithPath.js"; +export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; +export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts new file mode 100644 index 000000000000..920948641520 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts new file mode 100644 index 000000000000..f2004c062f3b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts new file mode 100644 index 000000000000..7761ce306fe3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts new file mode 100644 index 000000000000..ea9575e1ce1e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.boolean(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Request.Raw, +}; + +export declare namespace Request { + export type Raw = boolean; +} + +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Response.Raw, +}; + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts new file mode 100644 index 000000000000..52cc217d53a2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts new file mode 100644 index 000000000000..337a002320dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string().transform((s) => new Date(s)); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Date; + json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Date, + json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string().transform((s) => new Date(s)); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Date; + json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Date, + json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts new file mode 100644 index 000000000000..b04a1153d28b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, +}; + +export declare namespace Request { + export type Raw = number; +} + +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, +}; + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts new file mode 100644 index 000000000000..40b6b5b97418 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Request.Raw, +}; + +export declare namespace Request { + export type Raw = number; +} + +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Response.Raw, +}; + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts new file mode 100644 index 000000000000..0fc1f2cdff59 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Request.Raw, +}; + +export declare namespace Request { + export type Raw = number; +} + +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Response.Raw, +}; + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts new file mode 100644 index 000000000000..ec9d5995de47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts new file mode 100644 index 000000000000..7f5c79800271 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..9805ab86b129 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1,9 @@ +export * as getAndReturnBase64 from "./getAndReturnBase64.js"; +export * as getAndReturnBool from "./getAndReturnBool.js"; +export * as getAndReturnDate from "./getAndReturnDate.js"; +export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; +export * as getAndReturnDouble from "./getAndReturnDouble.js"; +export * as getAndReturnInt from "./getAndReturnInt.js"; +export * as getAndReturnLong from "./getAndReturnLong.js"; +export * as getAndReturnString from "./getAndReturnString.js"; +export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..fda956fe3da3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ErrorCategory_Schema = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +export const ErrorCategory: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCategory; + json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => serializers.endpoints.ErrorCategory.Raw; +} = { + _schema: _ErrorCategory_Schema, + parse: (raw: unknown) => _ErrorCategory_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCategory, + json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => parsed as serializers.endpoints.ErrorCategory.Raw, +}; + +export declare namespace ErrorCategory { + export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..0daa10ba1c93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,43 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ErrorCode_Schema = z.enum([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); +export const ErrorCode: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCode; + json: (parsed: SeedExhaustive.endpoints.ErrorCode) => serializers.endpoints.ErrorCode.Raw; +} = { + _schema: _ErrorCode_Schema, + parse: (raw: unknown) => _ErrorCode_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCode, + json: (parsed: SeedExhaustive.endpoints.ErrorCode) => parsed as serializers.endpoints.ErrorCode.Raw, +}; + +export declare namespace ErrorCode { + export type Raw = + | "INTERNAL_SERVER_ERROR" + | "UNAUTHORIZED" + | "FORBIDDEN" + | "BAD_REQUEST" + | "CONFLICT" + | "GONE" + | "UNPROCESSABLE_ENTITY" + | "NOT_IMPLEMENTED" + | "BAD_GATEWAY" + | "SERVICE_UNAVAILABLE" + | "Unknown"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..917889e06380 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,38 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ErrorCategory } from "./ErrorCategory.js"; +import { ErrorCode } from "./ErrorCode.js"; + +const _Error__Schema = z.object({ + category: ErrorCategory._schema, + code: ErrorCode._schema, + detail: z.string().optional(), + field: z.string().optional(), +}); +export const Error_: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.Error_; + json: (parsed: SeedExhaustive.endpoints.Error_) => serializers.endpoints.Error_.Raw; +} = { + _schema: _Error__Schema, + parse: (raw: unknown) => _Error__Schema.parse(raw) as SeedExhaustive.endpoints.Error_, + json: (parsed: SeedExhaustive.endpoints.Error_) => + ({ + category: ErrorCategory.json(parsed.category), + code: ErrorCode.json(parsed.code), + detail: parsed.detail, + field: parsed.field, + }) as serializers.endpoints.Error_.Raw, +}; + +export declare namespace Error_ { + export interface Raw { + category: ErrorCategory.Raw; + code: ErrorCode.Raw; + detail?: string | null; + field?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..520e6cfb62b7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Error_ } from "./Error_.js"; + +const _PutResponse_Schema = z.object({ + errors: z.array(Error_._schema).optional(), +}); +export const PutResponse: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.PutResponse; + json: (parsed: SeedExhaustive.endpoints.PutResponse) => serializers.endpoints.PutResponse.Raw; +} = { + _schema: _PutResponse_Schema, + parse: (raw: unknown) => _PutResponse_Schema.parse(raw) as SeedExhaustive.endpoints.PutResponse, + json: (parsed: SeedExhaustive.endpoints.PutResponse) => + ({ + errors: + parsed.errors != null + ? parsed.errors != null + ? parsed.errors.map((item) => Error_.json(item)) + : parsed.errors + : parsed.errors, + }) as serializers.endpoints.PutResponse.Raw, +}; + +export declare namespace PutResponse { + export interface Raw { + errors?: Error_.Raw[] | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..66e101cdc2d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1,4 @@ +export * as noEndingSlash from "./noEndingSlash.js"; +export * as withEndingSlash from "./withEndingSlash.js"; +export * as withMixedCase from "./withMixedCase.js"; +export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts new file mode 100644 index 000000000000..792cdff843dd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.noEndingSlash.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.noEndingSlash.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts new file mode 100644 index 000000000000..05918aed9575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withEndingSlash.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withEndingSlash.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts new file mode 100644 index 000000000000..ef6df73d7ec0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withMixedCase.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withMixedCase.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts new file mode 100644 index 000000000000..3e792cbc8530 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withUnderscores.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withUnderscores.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..f7a345d3368a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../api/index.js"; +import type * as serializers from "../../../index.js"; + +const _BadObjectRequestInfo_Schema = z.object({ + message: z.string(), +}); +export const BadObjectRequestInfo: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.BadObjectRequestInfo; + json: (parsed: SeedExhaustive.BadObjectRequestInfo) => serializers.BadObjectRequestInfo.Raw; +} = { + _schema: _BadObjectRequestInfo_Schema, + parse: (raw: unknown) => _BadObjectRequestInfo_Schema.parse(raw) as SeedExhaustive.BadObjectRequestInfo, + json: (parsed: SeedExhaustive.BadObjectRequestInfo) => parsed as serializers.BadObjectRequestInfo.Raw, +}; + +export declare namespace BadObjectRequestInfo { + export interface Raw { + message: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts new file mode 100644 index 000000000000..20b614a89e2f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts @@ -0,0 +1,9 @@ +export * as endpoints from "./endpoints/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..afdc575ededd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,40 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../api/index.js"; +import type * as serializers from "../../../../index.js"; +import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; + +const _PostWithObjectBody_Schema = z + .object({ + string: z.string(), + integer: z.number(), + NestedObject: ObjectWithOptionalField._schema, + }) + .transform((data) => ({ + string: data.string, + integer: data.integer, + nestedObject: data.NestedObject, + })); +export const PostWithObjectBody: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.PostWithObjectBody; + json: (parsed: SeedExhaustive.PostWithObjectBody) => serializers.PostWithObjectBody.Raw; +} = { + _schema: _PostWithObjectBody_Schema, + parse: (raw: unknown) => _PostWithObjectBody_Schema.parse(raw) as SeedExhaustive.PostWithObjectBody, + json: (parsed: SeedExhaustive.PostWithObjectBody) => + ({ + string: parsed.string, + integer: parsed.integer, + NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), + }) as serializers.PostWithObjectBody.Raw, +}; + +export declare namespace PostWithObjectBody { + export interface Raw { + string: string; + integer: number; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..d62a81ce61fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..549edcdba7f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts new file mode 100644 index 000000000000..7c8d3bf63cc1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../index.js"; + +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.noAuth.postWithNoAuth.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.noAuth.postWithNoAuth.Response.Raw, +}; + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..b62616349ec6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts new file mode 100644 index 000000000000..5880dd1a7111 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.noReqBody.postWithNoRequestBody.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.noReqBody.postWithNoRequestBody.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts new file mode 100644 index 000000000000..f3d5598805ba --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.reqWithHeaders.getWithCustomHeader.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.reqWithHeaders.getWithCustomHeader.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..fb7f25afb170 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..fda1be806c19 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithDocs_Schema = z.object({ + string: z.string(), +}); +export const ObjectWithDocs: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithDocs; + json: (parsed: SeedExhaustive.types.ObjectWithDocs) => serializers.types.ObjectWithDocs.Raw; +} = { + _schema: _ObjectWithDocs_Schema, + parse: (raw: unknown) => _ObjectWithDocs_Schema.parse(raw) as SeedExhaustive.types.ObjectWithDocs, + json: (parsed: SeedExhaustive.types.ObjectWithDocs) => parsed as serializers.types.ObjectWithDocs.Raw, +}; + +export declare namespace ObjectWithDocs { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..feebc1f6a916 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _WeatherReport_Schema = z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +export const WeatherReport: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.WeatherReport; + json: (parsed: SeedExhaustive.types.WeatherReport) => serializers.types.WeatherReport.Raw; +} = { + _schema: _WeatherReport_Schema, + parse: (raw: unknown) => _WeatherReport_Schema.parse(raw) as SeedExhaustive.types.WeatherReport, + json: (parsed: SeedExhaustive.types.WeatherReport) => parsed as serializers.types.WeatherReport.Raw, +}; + +export declare namespace WeatherReport { + export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts new file mode 100644 index 000000000000..52175f3cee16 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts @@ -0,0 +1,8 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..a68dc56bdfba --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { OptionalAlias } from "./OptionalAlias.js"; + +const _DoubleOptional_Schema = z.object({ + optionalAlias: OptionalAlias._schema.optional(), +}); +export const DoubleOptional: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.DoubleOptional; + json: (parsed: SeedExhaustive.types.DoubleOptional) => serializers.types.DoubleOptional.Raw; +} = { + _schema: _DoubleOptional_Schema, + parse: (raw: unknown) => _DoubleOptional_Schema.parse(raw) as SeedExhaustive.types.DoubleOptional, + json: (parsed: SeedExhaustive.types.DoubleOptional) => + ({ + optionalAlias: + parsed.optionalAlias != null + ? parsed.optionalAlias != null + ? OptionalAlias.json(parsed.optionalAlias) + : parsed.optionalAlias + : parsed.optionalAlias, + }) as serializers.types.DoubleOptional.Raw, +}; + +export declare namespace DoubleOptional { + export interface Raw { + optionalAlias?: (OptionalAlias.Raw | undefined) | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..c90be8618d11 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,44 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +const _NestedObjectWithOptionalField_Schema = z + .object({ + string: z.string().optional(), + NestedObject: ObjectWithOptionalField._schema.optional(), + }) + .transform((data) => ({ + string: data.string, + nestedObject: data.NestedObject, + })); +export const NestedObjectWithOptionalField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithOptionalField; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithOptionalField, + ) => serializers.types.NestedObjectWithOptionalField.Raw; +} = { + _schema: _NestedObjectWithOptionalField_Schema, + parse: (raw: unknown) => + _NestedObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithOptionalField, + json: (parsed: SeedExhaustive.types.NestedObjectWithOptionalField) => + ({ + string: parsed.string, + NestedObject: + parsed.nestedObject != null + ? parsed.nestedObject != null + ? ObjectWithOptionalField.json(parsed.nestedObject) + : parsed.nestedObject + : parsed.nestedObject, + }) as serializers.types.NestedObjectWithOptionalField.Raw, +}; + +export declare namespace NestedObjectWithOptionalField { + export interface Raw { + string?: string | null; + NestedObject?: ObjectWithOptionalField.Raw | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..ef7b8353d527 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +const _NestedObjectWithRequiredField_Schema = z + .object({ + string: z.string(), + NestedObject: ObjectWithOptionalField._schema, + }) + .transform((data) => ({ + string: data.string, + nestedObject: data.NestedObject, + })); +export const NestedObjectWithRequiredField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithRequiredField, + ) => serializers.types.NestedObjectWithRequiredField.Raw; +} = { + _schema: _NestedObjectWithRequiredField_Schema, + parse: (raw: unknown) => + _NestedObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField, + json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField) => + ({ + string: parsed.string, + NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), + }) as serializers.types.NestedObjectWithRequiredField.Raw, +}; + +export declare namespace NestedObjectWithRequiredField { + export interface Raw { + string: string; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..714c7594bacd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithMapOfMap_Schema = z.object({ + map: z.record(z.string(), z.record(z.string(), z.string())), +}); +export const ObjectWithMapOfMap: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithMapOfMap; + json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => serializers.types.ObjectWithMapOfMap.Raw; +} = { + _schema: _ObjectWithMapOfMap_Schema, + parse: (raw: unknown) => _ObjectWithMapOfMap_Schema.parse(raw) as SeedExhaustive.types.ObjectWithMapOfMap, + json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => parsed as serializers.types.ObjectWithMapOfMap.Raw, +}; + +export declare namespace ObjectWithMapOfMap { + export interface Raw { + map: Record>; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..29084d0e7dc7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,74 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithOptionalField_Schema = z.object({ + string: z.string().optional(), + integer: z.number().optional(), + long: z.number().optional(), + double: z.number().optional(), + bool: z.boolean().optional(), + datetime: z + .string() + .transform((s) => new Date(s)) + .optional(), + date: z.string().optional(), + uuid: z.string().optional(), + base64: z.string().optional(), + list: z.array(z.string()).optional(), + set: z + .array(z.string()) + .transform((arr) => new Set(arr)) + .optional(), + map: z.record(z.string(), z.string()).optional(), + bigint: z.string().optional(), +}); +export const ObjectWithOptionalField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithOptionalField; + json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => serializers.types.ObjectWithOptionalField.Raw; +} = { + _schema: _ObjectWithOptionalField_Schema, + parse: (raw: unknown) => _ObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithOptionalField, + json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => + ({ + string: parsed.string, + integer: parsed.integer, + long: parsed.long, + double: parsed.double, + bool: parsed.bool, + datetime: + parsed.datetime != null + ? parsed.datetime != null + ? parsed.datetime.toISOString() + : parsed.datetime + : parsed.datetime, + date: parsed.date, + uuid: parsed.uuid, + base64: parsed.base64, + list: parsed.list, + set: parsed.set != null ? (parsed.set != null ? Array.from(parsed.set) : parsed.set) : parsed.set, + map: parsed.map, + bigint: parsed.bigint, + }) as serializers.types.ObjectWithOptionalField.Raw, +}; + +export declare namespace ObjectWithOptionalField { + export interface Raw { + string?: string | null; + integer?: number | null; + long?: number | null; + double?: number | null; + bool?: boolean | null; + datetime?: string | null; + date?: string | null; + uuid?: string | null; + base64?: string | null; + list?: string[] | null; + set?: string[] | null; + map?: Record | null; + bigint?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..a721771913f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,25 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithRequiredField_Schema = z.object({ + string: z.string(), +}); +export const ObjectWithRequiredField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField; + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => serializers.types.ObjectWithRequiredField.Raw; +} = { + _schema: _ObjectWithRequiredField_Schema, + parse: (raw: unknown) => _ObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => + parsed as serializers.types.ObjectWithRequiredField.Raw, +}; + +export declare namespace ObjectWithRequiredField { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..a243622f1ee5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _OptionalAlias_Schema = z.string().optional(); +export const OptionalAlias: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.OptionalAlias; + json: (parsed: SeedExhaustive.types.OptionalAlias) => serializers.types.OptionalAlias.Raw; +} = { + _schema: _OptionalAlias_Schema, + parse: (raw: unknown) => _OptionalAlias_Schema.parse(raw) as SeedExhaustive.types.OptionalAlias, + json: (parsed: SeedExhaustive.types.OptionalAlias) => parsed as serializers.types.OptionalAlias.Raw, +}; + +export declare namespace OptionalAlias { + export type Raw = string | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..91b493ad4f9a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Cat } from "./Cat.js"; +import { Dog } from "./Dog.js"; + +const _Animal_Schema = z + .discriminatedUnion("animal", [ + z.object({ animal: z.literal("dog") }).merge(Dog._schema as z.AnyZodObject), + z.object({ animal: z.literal("cat") }).merge(Cat._schema as z.AnyZodObject), + ]) + .transform((value) => value); +export const Animal: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Animal; + json: (parsed: SeedExhaustive.types.Animal) => serializers.types.Animal.Raw; +} = { + _schema: _Animal_Schema, + parse: (raw: unknown) => _Animal_Schema.parse(raw) as SeedExhaustive.types.Animal, + json: (parsed: SeedExhaustive.types.Animal) => parsed as serializers.types.Animal.Raw, +}; + +export declare namespace Animal { + export type Raw = Animal.Dog | Animal.Cat; + + export interface Dog extends Dog.Raw { + animal: "dog"; + } + + export interface Cat extends Cat.Raw { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..0d6da57ce642 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _Cat_Schema = z.object({ + name: z.string(), + likesToMeow: z.boolean(), +}); +export const Cat: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Cat; + json: (parsed: SeedExhaustive.types.Cat) => serializers.types.Cat.Raw; +} = { + _schema: _Cat_Schema, + parse: (raw: unknown) => _Cat_Schema.parse(raw) as SeedExhaustive.types.Cat, + json: (parsed: SeedExhaustive.types.Cat) => parsed as serializers.types.Cat.Raw, +}; + +export declare namespace Cat { + export interface Raw { + name: string; + likesToMeow: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..0547a8bc7e85 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _Dog_Schema = z.object({ + name: z.string(), + likesToWoof: z.boolean(), +}); +export const Dog: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Dog; + json: (parsed: SeedExhaustive.types.Dog) => serializers.types.Dog.Raw; +} = { + _schema: _Dog_Schema, + parse: (raw: unknown) => _Dog_Schema.parse(raw) as SeedExhaustive.types.Dog, + json: (parsed: SeedExhaustive.types.Dog) => parsed as serializers.types.Dog.Raw, +}; + +export declare namespace Dog { + export interface Raw { + name: string; + likesToWoof: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..98b9ec0c58b9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + expect(response).toEqual(new Set(["string"])); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..4bc8916f7ce5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..b9e26c032ff9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..685826602e5e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..650fc620bb1d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..61b5a64bce8f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..8f5f6a59a512 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a128d4844ba2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json new file mode 100644 index 000000000000..bc0673c609b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "zurg" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +
+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json new file mode 100644 index 000000000000..ac3de0f37468 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json @@ -0,0 +1,78 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./serialization": { + "types": "./dist/cjs/serialization/index.d.ts", + "import": { + "types": "./dist/esm/serialization/index.d.mts", + "default": "./dist/esm/serialization/index.mjs" + }, + "require": { + "types": "./dist/cjs/serialization/index.d.ts", + "default": "./dist/cjs/serialization/index.js" + }, + "default": "./dist/cjs/serialization/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": {}, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md new file mode 100644 index 000000000000..b571afcab9fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Set` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Date` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json new file mode 100644 index 000000000000..875b76c4bb57 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts new file mode 100644 index 000000000000..f28de2b4c43c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts @@ -0,0 +1,82 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export interface BaseClientOptions { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + token?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts new file mode 100644 index 000000000000..d5ca904d9544 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..b124def3d861 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export interface Options extends BaseClientOptions {} +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..32bb0a7fc21e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,543 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfObjects.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfObjects.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {Set} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) + */ + public getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfObjects.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: + request != null + ? serializers.endpoints.container.getAndReturnOptional.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }) + : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnOptional.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..75f492ac343f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,178 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..9c9b0cd87c76 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.WeatherReport.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.WeatherReport.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..0298be639cde --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,380 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testGet.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testDelete.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..f7bbef9f5c00 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,577 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithMapOfMap.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithMapOfMap.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..e26b85a0f305 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,565 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithPath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithInlinePath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithPath.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithPath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithInlinePath.Request.jsonOrThrow(_body, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithInlinePath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..22ff4d032983 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,644 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace PrimitiveClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnString.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnString.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnInt.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnInt.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnLong.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnLong.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDouble.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDouble.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBool.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBool.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {Date} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) + */ + public getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDatetime.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDatetime.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDate.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDate.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnUuid.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnUuid.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBase64.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBase64.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..d3c0b566a0e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,90 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.PutResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..8ebfb6371c4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,97 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.Animal.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.Animal.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..6eee97a8bd78 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,247 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace UrlsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withMixedCase.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.noEndingSlash.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withEndingSlash.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withUnderscores.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..08c808a10650 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,126 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.PostWithObjectBody.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..15d3f75bc67d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..52430c224d0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,105 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noAuth.postWithNoAuth.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..055fc0084e37 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,142 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noReqBody.postWithNoRequestBody.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..a645609a3c92 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export interface Options extends BaseClientOptions {} + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.reqWithHeaders.getWithCustomHeader.Request.jsonOrThrow(_body, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..b7fce3790bf5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + xTestServiceHeader: string; + xTestEndpointHeader: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..324bb2e73908 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..322dcfbd5c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..2e6b3811b575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: Date; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: Set; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..b556b3f7bd94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface Options { + token?: core.Supplier; + } +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts new file mode 100644 index 000000000000..874173e71808 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts @@ -0,0 +1,7 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as serialization from "./schemas/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts new file mode 100644 index 000000000000..4cd8b1d95934 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts @@ -0,0 +1,103 @@ +import type { SchemaUtils } from "./builders/index.js"; + +export type Schema = BaseSchema & SchemaUtils; + +export type inferRaw = S extends Schema ? Raw : never; +export type inferParsed = S extends Schema ? Parsed : never; + +export interface BaseSchema { + parse: (raw: unknown, opts?: SchemaOptions) => MaybeValid; + json: (parsed: unknown, opts?: SchemaOptions) => MaybeValid; + getType: () => SchemaType | SchemaType; +} + +export const SchemaType = { + BIGINT: "bigint", + DATE: "date", + ENUM: "enum", + LIST: "list", + STRING_LITERAL: "stringLiteral", + BOOLEAN_LITERAL: "booleanLiteral", + OBJECT: "object", + ANY: "any", + BOOLEAN: "boolean", + NUMBER: "number", + STRING: "string", + UNKNOWN: "unknown", + NEVER: "never", + RECORD: "record", + SET: "set", + UNION: "union", + UNDISCRIMINATED_UNION: "undiscriminatedUnion", + NULLABLE: "nullable", + OPTIONAL: "optional", + OPTIONAL_NULLABLE: "optionalNullable", +} as const; + +export type SchemaType = (typeof SchemaType)[keyof typeof SchemaType]; + +export type MaybeValid = Valid | Invalid; + +export interface Valid { + ok: true; + value: T; +} + +export interface Invalid { + ok: false; + errors: ValidationError[]; +} + +export interface ValidationError { + path: string[]; + message: string; +} + +export interface SchemaOptions { + /** + * how to handle unrecognized keys in objects + * + * @default "fail" + */ + unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; + + /** + * whether to fail when an unrecognized discriminant value is + * encountered in a union + * + * @default false + */ + allowUnrecognizedUnionMembers?: boolean; + + /** + * whether to fail when an unrecognized enum value is encountered + * + * @default false + */ + allowUnrecognizedEnumValues?: boolean; + + /** + * whether to allow data that doesn't conform to the schema. + * invalid data is passed through without transformation. + * + * when this is enabled, .parse() and .json() will always + * return `ok: true`. `.parseOrThrow()` and `.jsonOrThrow()` + * will never fail. + * + * @default false + */ + skipValidation?: boolean; + + /** + * each validation failure contains a "path" property, which is + * the breadcrumbs to the offending node in the JSON. you can supply + * a prefix that is prepended to all the errors' paths. this can be + * helpful for zurg's internal debug logging. + */ + breadcrumbsPrefix?: string[]; + + /** + * whether to send 'null' for optional properties explicitly set to 'undefined'. + */ + omitUndefined?: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts new file mode 100644 index 000000000000..2c7c74c54a37 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts @@ -0,0 +1,55 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function bigint(): Schema { + const baseSchema: BaseSchema = { + parse: (raw, { breadcrumbsPrefix = [] } = {}) => { + if (typeof raw === "bigint") { + return { + ok: true, + value: raw, + }; + } + if (typeof raw === "number") { + return { + ok: true, + value: BigInt(raw), + }; + } + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "bigint | number"), + }, + ], + }; + }, + json: (bigint, { breadcrumbsPrefix = [] } = {}) => { + if (typeof bigint !== "bigint") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(bigint, "bigint"), + }, + ], + }; + } + return { + ok: true, + value: bigint, + }; + }, + getType: () => SchemaType.BIGINT, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts new file mode 100644 index 000000000000..13cc76e25b2a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts @@ -0,0 +1 @@ +export { bigint } from "./bigint.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts new file mode 100644 index 000000000000..f02e3367f88f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts @@ -0,0 +1,65 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +// https://stackoverflow.com/questions/12756159/regex-and-iso8601-formatted-datetime +const ISO_8601_REGEX = + /^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([.,]\d+(?!:))?)?(\17[0-5]\d([.,]\d+)?)?([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; + +export function date(): Schema { + const baseSchema: BaseSchema = { + parse: (raw, { breadcrumbsPrefix = [] } = {}) => { + if (typeof raw !== "string") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "string"), + }, + ], + }; + } + if (!ISO_8601_REGEX.test(raw)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "ISO 8601 date string"), + }, + ], + }; + } + return { + ok: true, + value: new Date(raw), + }; + }, + json: (date, { breadcrumbsPrefix = [] } = {}) => { + if (date instanceof Date) { + return { + ok: true, + value: date.toISOString(), + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(date, "Date object"), + }, + ], + }; + } + }, + getType: () => SchemaType.DATE, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts new file mode 100644 index 000000000000..e22a2f16bfc9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts @@ -0,0 +1 @@ +export { date } from "./date.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts new file mode 100644 index 000000000000..ccae24bcf200 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts @@ -0,0 +1,43 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function enum_(values: E): Schema { + const validValues = new Set(values); + + const schemaCreator = createIdentitySchemaCreator( + SchemaType.ENUM, + (value, { allowUnrecognizedEnumValues, breadcrumbsPrefix = [] } = {}) => { + if (typeof value !== "string") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "string"), + }, + ], + }; + } + + if (!validValues.has(value) && !allowUnrecognizedEnumValues) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "enum"), + }, + ], + }; + } + + return { + ok: true, + value: value as U, + }; + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts new file mode 100644 index 000000000000..ff3bee3bf653 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts @@ -0,0 +1 @@ +export { enum_ } from "./enum.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts new file mode 100644 index 000000000000..ddb9b3c94555 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts @@ -0,0 +1,14 @@ +export * from "./bigint/index.js"; +export * from "./date/index.js"; +export * from "./enum/index.js"; +export * from "./lazy/index.js"; +export * from "./list/index.js"; +export * from "./literals/index.js"; +export * from "./object/index.js"; +export * from "./object-like/index.js"; +export * from "./primitives/index.js"; +export * from "./record/index.js"; +export * from "./schema-utils/index.js"; +export * from "./set/index.js"; +export * from "./undiscriminated-union/index.js"; +export * from "./union/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts new file mode 100644 index 000000000000..e8ca40992061 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts @@ -0,0 +1,3 @@ +export type { SchemaGetter } from "./lazy.js"; +export { lazy } from "./lazy.js"; +export { lazyObject } from "./lazyObject.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts new file mode 100644 index 000000000000..37f28871683a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts @@ -0,0 +1,32 @@ +import type { BaseSchema, Schema } from "../../Schema.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export type SchemaGetter> = () => SchemaType; + +export function lazy(getter: SchemaGetter>): Schema { + const baseSchema = constructLazyBaseSchema(getter); + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function constructLazyBaseSchema( + getter: SchemaGetter>, +): BaseSchema { + return { + parse: (raw, opts) => getMemoizedSchema(getter).parse(raw, opts), + json: (parsed, opts) => getMemoizedSchema(getter).json(parsed, opts), + getType: () => getMemoizedSchema(getter).getType(), + }; +} + +type MemoizedGetter> = SchemaGetter & { __zurg_memoized?: SchemaType }; + +export function getMemoizedSchema>(getter: SchemaGetter): SchemaType { + const castedGetter = getter as MemoizedGetter; + if (castedGetter.__zurg_memoized == null) { + castedGetter.__zurg_memoized = getter(); + } + return castedGetter.__zurg_memoized; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts new file mode 100644 index 000000000000..192c90e5c83e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts @@ -0,0 +1,20 @@ +import { getObjectUtils } from "../object/index.js"; +import type { BaseObjectSchema, ObjectSchema } from "../object/types.js"; +import { getObjectLikeUtils } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import { constructLazyBaseSchema, getMemoizedSchema, type SchemaGetter } from "./lazy.js"; + +export function lazyObject(getter: SchemaGetter>): ObjectSchema { + const baseSchema: BaseObjectSchema = { + ...constructLazyBaseSchema(getter), + _getRawProperties: () => getMemoizedSchema(getter)._getRawProperties(), + _getParsedProperties: () => getMemoizedSchema(getter)._getParsedProperties(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts new file mode 100644 index 000000000000..021f1e4df1ff --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts @@ -0,0 +1 @@ +export { list } from "./list.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts new file mode 100644 index 000000000000..4f8c10ba483a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts @@ -0,0 +1,73 @@ +import { type BaseSchema, type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function list(schema: Schema): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => + validateAndTransformArray(raw, (item, index) => + schema.parse(item, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], + }), + ), + json: (parsed, opts) => + validateAndTransformArray(parsed, (item, index) => + schema.json(item, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], + }), + ), + getType: () => SchemaType.LIST, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformArray( + value: unknown, + transformItem: (item: Raw, index: number) => MaybeValid, +): MaybeValid { + if (!Array.isArray(value)) { + return { + ok: false, + errors: [ + { + message: getErrorMessageForIncorrectType(value, "list"), + path: [], + }, + ], + }; + } + + const maybeValidItems = value.map((item, index) => transformItem(item, index)); + + return maybeValidItems.reduce>( + (acc, item) => { + if (acc.ok && item.ok) { + return { + ok: true, + value: [...acc.value, item.value], + }; + } + + const errors: ValidationError[] = []; + if (!acc.ok) { + errors.push(...acc.errors); + } + if (!item.ok) { + errors.push(...item.errors); + } + + return { + ok: false, + errors, + }; + }, + { ok: true, value: [] }, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts new file mode 100644 index 000000000000..db5d2c7a7313 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function booleanLiteral(literal: V): Schema { + const schemaCreator = createIdentitySchemaCreator( + SchemaType.BOOLEAN_LITERAL, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (value === literal) { + return { + ok: true, + value: literal, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, `${literal.toString()}`), + }, + ], + }; + } + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts new file mode 100644 index 000000000000..4a4ab39d91a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts @@ -0,0 +1,2 @@ +export { booleanLiteral } from "./booleanLiteral.js"; +export { stringLiteral } from "./stringLiteral.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts new file mode 100644 index 000000000000..ce6e20caf8d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function stringLiteral(literal: V): Schema { + const schemaCreator = createIdentitySchemaCreator( + SchemaType.STRING_LITERAL, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (value === literal) { + return { + ok: true, + value: literal, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, `"${literal}"`), + }, + ], + }; + } + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts new file mode 100644 index 000000000000..af69acb01dc1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts @@ -0,0 +1,79 @@ +import type { BaseSchema } from "../../Schema.js"; +import { filterObject } from "../../utils/filterObject.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; + +export function getObjectLikeUtils(schema: BaseSchema): ObjectLikeUtils { + return { + withParsedProperties: (properties) => withParsedProperties(schema, properties), + }; +} + +/** + * object-like utils are defined in one file to resolve issues with circular imports + */ + +export function withParsedProperties( + objectLike: BaseSchema, + properties: { [K in keyof Properties]: Properties[K] | ((parsed: ParsedObjectShape) => Properties[K]) }, +): ObjectLikeSchema { + const objectSchema: BaseSchema = { + parse: (raw, opts) => { + const parsedObject = objectLike.parse(raw, opts); + if (!parsedObject.ok) { + return parsedObject; + } + + const additionalProperties = Object.entries(properties).reduce>( + (processed, [key, value]) => { + return { + ...processed, + [key]: typeof value === "function" ? value(parsedObject.value) : value, + }; + }, + {}, + ); + + return { + ok: true, + value: { + ...parsedObject.value, + ...(additionalProperties as Properties), + }, + }; + }, + + json: (parsed, opts) => { + if (!isPlainObject(parsed)) { + return { + ok: false, + errors: [ + { + path: opts?.breadcrumbsPrefix ?? [], + message: getErrorMessageForIncorrectType(parsed, "object"), + }, + ], + }; + } + + // strip out added properties + const addedPropertyKeys = new Set(Object.keys(properties)); + const parsedWithoutAddedProperties = filterObject( + parsed, + Object.keys(parsed).filter((key) => !addedPropertyKeys.has(key)), + ); + + return objectLike.json(parsedWithoutAddedProperties as ParsedObjectShape, opts); + }, + + getType: () => objectLike.getType(), + }; + + return { + ...objectSchema, + ...getSchemaUtils(objectSchema), + ...getObjectLikeUtils(objectSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts new file mode 100644 index 000000000000..2451ef7d0e50 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts @@ -0,0 +1,2 @@ +export { getObjectLikeUtils, withParsedProperties } from "./getObjectLikeUtils.js"; +export type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts new file mode 100644 index 000000000000..44b9669108cb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts @@ -0,0 +1,13 @@ +import type { BaseSchema, Schema } from "../../Schema.js"; + +export type ObjectLikeSchema = Schema & + BaseSchema & + ObjectLikeUtils; + +export interface ObjectLikeUtils { + withParsedProperties: >( + properties: { + [K in keyof T]: T[K] | ((parsed: Parsed) => T[K]); + }, + ) => ObjectLikeSchema; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts new file mode 100644 index 000000000000..c6611aaacd3b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts @@ -0,0 +1,22 @@ +export { getObjectUtils, object } from "./object.js"; +export type { + inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas, +} from "./objectWithoutOptionalProperties.js"; +export { objectWithoutOptionalProperties } from "./objectWithoutOptionalProperties.js"; +export type { Property } from "./property.js"; +export { isProperty, property } from "./property.js"; +export type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObject, + inferParsedObjectFromPropertySchemas, + inferParsedPropertySchema, + inferRawKey, + inferRawObject, + inferRawObjectFromPropertySchemas, + inferRawPropertySchema, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts new file mode 100644 index 000000000000..624d4d3888d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts @@ -0,0 +1,382 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { entries } from "../../utils/entries.js"; +import { filterObject } from "../../utils/filterObject.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { keys } from "../../utils/keys.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { partition } from "../../utils/partition.js"; +import { getObjectLikeUtils } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import { isProperty } from "./property.js"; +import type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObjectFromPropertySchemas, + inferRawObjectFromPropertySchemas, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types.js"; + +interface ObjectPropertyWithRawKey { + rawKey: string; + parsedKey: string; + valueSchema: Schema; +} + +export function object>( + schemas: T, +): inferObjectSchemaFromPropertySchemas { + const baseSchema: BaseObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectFromPropertySchemas + > = { + _getRawProperties: () => + Object.entries(schemas).map(([parsedKey, propertySchema]) => + isProperty(propertySchema) ? propertySchema.rawKey : parsedKey, + ) as unknown as (keyof inferRawObjectFromPropertySchemas)[], + _getParsedProperties: () => keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[], + + parse: (raw, opts) => { + const rawKeyToProperty: Record = {}; + const requiredKeys: string[] = []; + + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const rawKey = isProperty(schemaOrObjectProperty) ? schemaOrObjectProperty.rawKey : parsedKey; + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; + + const property: ObjectPropertyWithRawKey = { + rawKey, + parsedKey: parsedKey as string, + valueSchema, + }; + + rawKeyToProperty[rawKey] = property; + + if (isSchemaRequired(valueSchema)) { + requiredKeys.push(rawKey); + } + } + + return validateAndTransformObject({ + value: raw, + requiredKeys, + getProperty: (rawKey) => { + const property = rawKeyToProperty[rawKey]; + if (property == null) { + return undefined; + } + return { + transformedKey: property.parsedKey, + transform: (propertyValue) => + property.valueSchema.parse(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawKey], + }), + }; + }, + unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, + skipValidation: opts?.skipValidation, + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + omitUndefined: opts?.omitUndefined, + }); + }, + + json: (parsed, opts) => { + const requiredKeys: string[] = []; + + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; + + if (isSchemaRequired(valueSchema)) { + requiredKeys.push(parsedKey as string); + } + } + + return validateAndTransformObject({ + value: parsed, + requiredKeys, + getProperty: ( + parsedKey, + ): { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined => { + const property = schemas[parsedKey as keyof T]; + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (property == null) { + return undefined; + } + + if (isProperty(property)) { + return { + transformedKey: property.rawKey, + transform: (propertyValue) => + property.valueSchema.json(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], + }), + }; + } else { + return { + transformedKey: parsedKey, + transform: (propertyValue) => + property.json(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], + }), + }; + } + }, + unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, + skipValidation: opts?.skipValidation, + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + omitUndefined: opts?.omitUndefined, + }); + }, + + getType: () => SchemaType.OBJECT, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} + +function validateAndTransformObject({ + value, + requiredKeys, + getProperty, + unrecognizedObjectKeys = "fail", + skipValidation = false, + breadcrumbsPrefix = [], +}: { + value: unknown; + requiredKeys: string[]; + getProperty: ( + preTransformedKey: string, + ) => { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined; + unrecognizedObjectKeys: "fail" | "passthrough" | "strip" | undefined; + skipValidation: boolean | undefined; + breadcrumbsPrefix: string[] | undefined; + omitUndefined: boolean | undefined; +}): MaybeValid { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const missingRequiredKeys = new Set(requiredKeys); + const errors: ValidationError[] = []; + const transformed: Record = {}; + + for (const [preTransformedKey, preTransformedItemValue] of Object.entries(value)) { + const property = getProperty(preTransformedKey); + + if (property != null) { + missingRequiredKeys.delete(preTransformedKey); + + const value = property.transform(preTransformedItemValue as object); + if (value.ok) { + transformed[property.transformedKey] = value.value; + } else { + transformed[preTransformedKey] = preTransformedItemValue; + errors.push(...value.errors); + } + } else { + switch (unrecognizedObjectKeys) { + case "fail": + errors.push({ + path: [...breadcrumbsPrefix, preTransformedKey], + message: `Unexpected key "${preTransformedKey}"`, + }); + break; + case "strip": + break; + case "passthrough": + transformed[preTransformedKey] = preTransformedItemValue; + break; + } + } + } + + errors.push( + ...requiredKeys + .filter((key) => missingRequiredKeys.has(key)) + .map((key) => ({ + path: breadcrumbsPrefix, + message: `Missing required key "${key}"`, + })), + ); + + if (errors.length === 0 || skipValidation) { + return { + ok: true, + value: transformed as Transformed, + }; + } else { + return { + ok: false, + errors, + }; + } +} + +export function getObjectUtils(schema: BaseObjectSchema): ObjectUtils { + return { + extend: (extension: ObjectSchema) => { + const baseSchema: BaseObjectSchema = { + _getParsedProperties: () => [...schema._getParsedProperties(), ...extension._getParsedProperties()], + _getRawProperties: () => [...schema._getRawProperties(), ...extension._getRawProperties()], + parse: (raw, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: extension._getRawProperties(), + value: raw, + transformBase: (rawBase) => schema.parse(rawBase, opts), + transformExtension: (rawExtension) => extension.parse(rawExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: extension._getParsedProperties(), + value: parsed, + transformBase: (parsedBase) => schema.json(parsedBase, opts), + transformExtension: (parsedExtension) => extension.json(parsedExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.OBJECT, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; + }, + passthrough: () => { + const baseSchema: BaseObjectSchema = + { + _getParsedProperties: () => schema._getParsedProperties(), + _getRawProperties: () => schema._getRawProperties(), + parse: (raw, opts) => { + const transformed = schema.parse(raw, { ...opts, unrecognizedObjectKeys: "passthrough" }); + if (!transformed.ok) { + return transformed; + } + return { + ok: true, + value: { + ...(raw as any), + ...transformed.value, + }, + }; + }, + json: (parsed, opts) => { + const transformed = schema.json(parsed, { ...opts, unrecognizedObjectKeys: "passthrough" }); + if (!transformed.ok) { + return transformed; + } + return { + ok: true, + value: { + ...(parsed as any), + ...transformed.value, + }, + }; + }, + getType: () => SchemaType.OBJECT, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; + }, + }; +} + +function validateAndTransformExtendedObject({ + extensionKeys, + value, + transformBase, + transformExtension, + breadcrumbsPrefix = [], +}: { + extensionKeys: (keyof PreTransformedExtension)[]; + value: unknown; + transformBase: (value: object) => MaybeValid; + transformExtension: (value: object) => MaybeValid; + breadcrumbsPrefix?: string[]; +}): MaybeValid { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const extensionPropertiesSet = new Set(extensionKeys); + const [extensionProperties, baseProperties] = partition(keys(value), (key) => + extensionPropertiesSet.has(key as keyof PreTransformedExtension), + ); + + const transformedBase = transformBase(filterObject(value, baseProperties)); + const transformedExtension = transformExtension(filterObject(value, extensionProperties)); + + if (transformedBase.ok && transformedExtension.ok) { + return { + ok: true, + value: { + ...transformedBase.value, + ...transformedExtension.value, + }, + }; + } else { + return { + ok: false, + errors: [ + ...(transformedBase.ok ? [] : transformedBase.errors), + ...(transformedExtension.ok ? [] : transformedExtension.errors), + ], + }; + } +} + +function isSchemaRequired(schema: Schema): boolean { + return !isSchemaOptional(schema); +} + +function isSchemaOptional(schema: Schema): boolean { + switch (schema.getType()) { + case SchemaType.ANY: + case SchemaType.UNKNOWN: + case SchemaType.OPTIONAL: + case SchemaType.OPTIONAL_NULLABLE: + return true; + default: + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts new file mode 100644 index 000000000000..4d39c862f0c4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts @@ -0,0 +1,23 @@ +import { object } from "./object.js"; +import type { + inferParsedPropertySchema, + inferRawObjectFromPropertySchemas, + ObjectSchema, + PropertySchemas, +} from "./types.js"; + +export function objectWithoutOptionalProperties>( + schemas: T, +): inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas { + return object(schemas) as unknown as inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas; +} + +export type inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas> = + ObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas + >; + +export type inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas> = { + [K in keyof T]: inferParsedPropertySchema; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts new file mode 100644 index 000000000000..d1f9f386aa64 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts @@ -0,0 +1,23 @@ +import type { Schema } from "../../Schema.js"; + +export function property( + rawKey: RawKey, + valueSchema: Schema, +): Property { + return { + rawKey, + valueSchema, + isProperty: true, + }; +} + +export interface Property { + rawKey: RawKey; + valueSchema: Schema; + isProperty: true; +} + +export function isProperty>(maybeProperty: unknown): maybeProperty is O { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return (maybeProperty as O).isProperty; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts new file mode 100644 index 000000000000..735d14fc4cee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts @@ -0,0 +1,73 @@ +import type { BaseSchema, inferParsed, inferRaw, Schema } from "../../Schema.js"; +import type { addQuestionMarksToNullableProperties } from "../../utils/addQuestionMarksToNullableProperties.js"; +import type { ObjectLikeUtils } from "../object-like/index.js"; +import type { SchemaUtils } from "../schema-utils/index.js"; +import type { Property } from "./property.js"; + +export type ObjectSchema = BaseObjectSchema & + ObjectLikeUtils & + ObjectUtils & + SchemaUtils; + +export interface BaseObjectSchema extends BaseSchema { + _getRawProperties: () => (keyof Raw)[]; + _getParsedProperties: () => (keyof Parsed)[]; +} + +export interface ObjectUtils { + extend: ( + schemas: ObjectSchema, + ) => ObjectSchema; + passthrough: () => ObjectSchema; +} + +export type inferRawObject> = O extends ObjectSchema ? Raw : never; + +export type inferParsedObject> = O extends ObjectSchema + ? Parsed + : never; + +export type inferObjectSchemaFromPropertySchemas> = ObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectFromPropertySchemas +>; + +export type inferRawObjectFromPropertySchemas> = + addQuestionMarksToNullableProperties<{ + [ParsedKey in keyof T as inferRawKey]: inferRawPropertySchema; + }>; + +export type inferParsedObjectFromPropertySchemas> = + addQuestionMarksToNullableProperties<{ + [K in keyof T]: inferParsedPropertySchema; + }>; + +export type PropertySchemas = Record< + ParsedKeys, + Property | Schema +>; + +export type inferRawPropertySchema

| Schema> = P extends Property< + any, + infer Raw, + any +> + ? Raw + : P extends Schema + ? inferRaw

+ : never; + +export type inferParsedPropertySchema

| Schema> = P extends Property< + any, + any, + infer Parsed +> + ? Parsed + : P extends Schema + ? inferParsed

+ : never; + +export type inferRawKey< + ParsedKey extends string | number | symbol, + P extends Property | Schema, +> = P extends Property ? Raw : ParsedKey; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts new file mode 100644 index 000000000000..bc4d47fab56e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const any: () => Schema = createIdentitySchemaCreator(SchemaType.ANY, (value) => ({ + ok: true, + value, +})); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts new file mode 100644 index 000000000000..78c3c36284c7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const boolean: () => Schema = createIdentitySchemaCreator( + SchemaType.BOOLEAN, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "boolean") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "boolean"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts new file mode 100644 index 000000000000..7a3ee0154829 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts @@ -0,0 +1,6 @@ +export { any } from "./any.js"; +export { boolean } from "./boolean.js"; +export { never } from "./never.js"; +export { number } from "./number.js"; +export { string } from "./string.js"; +export { unknown } from "./unknown.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts new file mode 100644 index 000000000000..91f85d74c01b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts @@ -0,0 +1,15 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const never: () => Schema = createIdentitySchemaCreator( + SchemaType.NEVER, + (_value, { breadcrumbsPrefix = [] } = {}) => ({ + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: "Expected never", + }, + ], + }), +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts new file mode 100644 index 000000000000..6f16cd462a1b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const number: () => Schema = createIdentitySchemaCreator( + SchemaType.NUMBER, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "number") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "number"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts new file mode 100644 index 000000000000..b29d72ae7ef1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const string: () => Schema = createIdentitySchemaCreator( + SchemaType.STRING, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "string") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "string"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts new file mode 100644 index 000000000000..04514160366f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const unknown: () => Schema = createIdentitySchemaCreator( + SchemaType.UNKNOWN, + (value) => ({ ok: true, value }), +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts new file mode 100644 index 000000000000..b17997f7bf84 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts @@ -0,0 +1,2 @@ +export { record } from "./record.js"; +export type { BaseRecordSchema, RecordSchema } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts new file mode 100644 index 000000000000..a489660399b7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts @@ -0,0 +1,129 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { entries } from "../../utils/entries.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { BaseRecordSchema, RecordSchema } from "./types.js"; + +export function record( + keySchema: Schema, + valueSchema: Schema, +): RecordSchema { + const baseSchema: BaseRecordSchema = { + parse: (raw, opts) => { + return validateAndTransformRecord({ + value: raw, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.parse(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.parse(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return validateAndTransformRecord({ + value: parsed, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.json(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.json(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.RECORD, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformRecord({ + value, + isKeyNumeric, + transformKey, + transformValue, + breadcrumbsPrefix = [], +}: { + value: unknown; + isKeyNumeric: boolean; + transformKey: (key: string | number) => MaybeValid; + transformValue: (value: unknown, key: string | number) => MaybeValid; + breadcrumbsPrefix: string[] | undefined; +}): MaybeValid> { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + return entries(value).reduce>>( + (accPromise, [stringKey, value]) => { + if (value === undefined) { + return accPromise; + } + + const acc = accPromise; + + let key: string | number = stringKey; + if (isKeyNumeric) { + const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; + if (!Number.isNaN(numberKey)) { + key = numberKey; + } + } + const transformedKey = transformKey(key); + + const transformedValue = transformValue(value, key); + + if (acc.ok && transformedKey.ok && transformedValue.ok) { + return { + ok: true, + value: { + ...acc.value, + [transformedKey.value]: transformedValue.value, + }, + }; + } + + const errors: ValidationError[] = []; + if (!acc.ok) { + errors.push(...acc.errors); + } + if (!transformedKey.ok) { + errors.push(...transformedKey.errors); + } + if (!transformedValue.ok) { + errors.push(...transformedValue.errors); + } + + return { + ok: false, + errors, + }; + }, + { ok: true, value: {} as Record }, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts new file mode 100644 index 000000000000..5950b4cbde1e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts @@ -0,0 +1,17 @@ +import type { BaseSchema } from "../../Schema.js"; +import type { SchemaUtils } from "../schema-utils/index.js"; + +export type RecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BaseRecordSchema & + SchemaUtils, Record>; + +export type BaseRecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BaseSchema, Record>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts new file mode 100644 index 000000000000..daee3dc79184 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema.js"; +import { stringifyValidationError } from "./stringifyValidationErrors.js"; + +export class JsonError extends Error { + constructor(public readonly errors: ValidationError[]) { + super(errors.map(stringifyValidationError).join("; ")); + Object.setPrototypeOf(this, JsonError.prototype); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts new file mode 100644 index 000000000000..9facf06159b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema.js"; +import { stringifyValidationError } from "./stringifyValidationErrors.js"; + +export class ParseError extends Error { + constructor(public readonly errors: ValidationError[]) { + super(errors.map(stringifyValidationError).join("; ")); + Object.setPrototypeOf(this, ParseError.prototype); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts new file mode 100644 index 000000000000..3ceaf4e011f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts @@ -0,0 +1,181 @@ +import { type BaseSchema, type Schema, type SchemaOptions, SchemaType } from "../../Schema.js"; +import { JsonError } from "./JsonError.js"; +import { ParseError } from "./ParseError.js"; + +export interface SchemaUtils { + nullable: () => Schema; + optional: () => Schema; + optionalNullable: () => Schema; + transform: (transformer: SchemaTransformer) => Schema; + parseOrThrow: (raw: unknown, opts?: SchemaOptions) => Parsed; + jsonOrThrow: (raw: unknown, opts?: SchemaOptions) => Raw; +} + +export interface SchemaTransformer { + transform: (parsed: Parsed) => Transformed; + untransform: (transformed: any) => Parsed; +} + +export function getSchemaUtils(schema: BaseSchema): SchemaUtils { + return { + nullable: () => nullable(schema), + optional: () => optional(schema), + optionalNullable: () => optionalNullable(schema), + transform: (transformer) => transform(schema, transformer), + parseOrThrow: (raw, opts) => { + const parsed = schema.parse(raw, opts); + if (parsed.ok) { + return parsed.value; + } + throw new ParseError(parsed.errors); + }, + jsonOrThrow: (parsed, opts) => { + const raw = schema.json(parsed, opts); + if (raw.ok) { + return raw.value; + } + throw new JsonError(raw.errors); + }, + }; +} + +/** + * schema utils are defined in one file to resolve issues with circular imports + */ + +export function nullable(schema: BaseSchema): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw == null) { + return { + ok: true, + value: null, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (parsed == null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.NULLABLE, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function optional( + schema: BaseSchema, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw == null) { + return { + ok: true, + value: undefined, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (opts?.omitUndefined && parsed === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (parsed == null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.OPTIONAL, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function optionalNullable( + schema: BaseSchema, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (raw === null) { + return { + ok: true, + value: null, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (parsed === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (parsed === null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.OPTIONAL_NULLABLE, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function transform( + schema: BaseSchema, + transformer: SchemaTransformer, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + const parsed = schema.parse(raw, opts); + if (!parsed.ok) { + return parsed; + } + return { + ok: true, + value: transformer.transform(parsed.value), + }; + }, + json: (transformed, opts) => { + const parsed = transformer.untransform(transformed); + return schema.json(parsed, opts); + }, + getType: () => schema.getType(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts new file mode 100644 index 000000000000..efb3b0c46288 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts @@ -0,0 +1,4 @@ +export type { SchemaUtils } from "./getSchemaUtils.js"; +export { getSchemaUtils, optional, transform } from "./getSchemaUtils.js"; +export { JsonError } from "./JsonError.js"; +export { ParseError } from "./ParseError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts new file mode 100644 index 000000000000..d36a4900c6e6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts @@ -0,0 +1,8 @@ +import type { ValidationError } from "../../Schema.js"; + +export function stringifyValidationError(error: ValidationError): string { + if (error.path.length === 0) { + return error.message; + } + return `${error.path.join(" -> ")}: ${error.message}`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts new file mode 100644 index 000000000000..c72be55e9406 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts @@ -0,0 +1 @@ +export { set } from "./set.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts new file mode 100644 index 000000000000..2013cdb4760f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts @@ -0,0 +1,43 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { list } from "../list/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function set(schema: Schema): Schema> { + const listSchema = list(schema); + const baseSchema: BaseSchema> = { + parse: (raw, opts) => { + const parsedList = listSchema.parse(raw, opts); + if (parsedList.ok) { + return { + ok: true, + value: new Set(parsedList.value), + }; + } else { + return parsedList; + } + }, + json: (parsed, opts) => { + if (!(parsed instanceof Set)) { + return { + ok: false, + errors: [ + { + path: opts?.breadcrumbsPrefix ?? [], + message: getErrorMessageForIncorrectType(parsed, "Set"), + }, + ], + }; + } + const jsonList = listSchema.json([...parsed], opts); + return jsonList; + }, + getType: () => SchemaType.SET, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts new file mode 100644 index 000000000000..c8318222b4f7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts @@ -0,0 +1,6 @@ +export type { + inferParsedUnidiscriminatedUnionSchema, + inferRawUnidiscriminatedUnionSchema, + UndiscriminatedUnionSchema, +} from "./types.js"; +export { undiscriminatedUnion } from "./undiscriminatedUnion.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts new file mode 100644 index 000000000000..0d5096fab913 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts @@ -0,0 +1,10 @@ +import type { inferParsed, inferRaw, Schema } from "../../Schema.js"; + +export type UndiscriminatedUnionSchema = Schema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema +>; + +export type inferRawUnidiscriminatedUnionSchema = inferRaw; + +export type inferParsedUnidiscriminatedUnionSchema = inferParsed; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts new file mode 100644 index 000000000000..07591b4d3e63 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts @@ -0,0 +1,67 @@ +import { + type BaseSchema, + type MaybeValid, + type Schema, + type SchemaOptions, + SchemaType, + type ValidationError, +} from "../../Schema.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { inferParsedUnidiscriminatedUnionSchema, inferRawUnidiscriminatedUnionSchema } from "./types.js"; + +export function undiscriminatedUnion, ...Schema[]]>( + schemas: Schemas, +): Schema, inferParsedUnidiscriminatedUnionSchema> { + const baseSchema: BaseSchema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema + > = { + parse: (raw, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.parse(raw, opts), + schemas, + opts, + ); + }, + json: (parsed, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.json(parsed, opts), + schemas, + opts, + ); + }, + getType: () => SchemaType.UNDISCRIMINATED_UNION, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformUndiscriminatedUnion( + transform: (schema: Schema, opts: SchemaOptions) => MaybeValid, + schemas: Schema[], + opts: SchemaOptions | undefined, +): MaybeValid { + const errors: ValidationError[] = []; + for (const [index, schema] of schemas.entries()) { + const transformed = transform(schema, { ...opts, skipValidation: false }); + if (transformed.ok) { + return transformed; + } else { + for (const error of transformed.errors) { + errors.push({ + path: error.path, + message: `[Variant ${index}] ${error.message}`, + }); + } + } + } + + return { + ok: false, + errors, + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts new file mode 100644 index 000000000000..73cd62adeba5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts @@ -0,0 +1,14 @@ +export function discriminant( + parsedDiscriminant: ParsedDiscriminant, + rawDiscriminant: RawDiscriminant, +): Discriminant { + return { + parsedDiscriminant, + rawDiscriminant, + }; +} + +export interface Discriminant { + parsedDiscriminant: ParsedDiscriminant; + rawDiscriminant: RawDiscriminant; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts new file mode 100644 index 000000000000..6bc29ba9ed38 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts @@ -0,0 +1,10 @@ +export type { Discriminant } from "./discriminant.js"; +export { discriminant } from "./discriminant.js"; +export type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types.js"; +export { union } from "./union.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts new file mode 100644 index 000000000000..7bfdd636d8d0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts @@ -0,0 +1,26 @@ +import type { inferParsedObject, inferRawObject, ObjectSchema } from "../object/index.js"; +import type { Discriminant } from "./discriminant.js"; + +export type UnionSubtypes = { + [K in DiscriminantValues]: ObjectSchema; +}; + +export type inferRawUnion, U extends UnionSubtypes> = { + [K in keyof U]: Record, K> & inferRawObject; +}[keyof U]; + +export type inferParsedUnion, U extends UnionSubtypes> = { + [K in keyof U]: Record, K> & inferParsedObject; +}[keyof U]; + +export type inferRawDiscriminant> = D extends string + ? D + : D extends Discriminant + ? Raw + : never; + +export type inferParsedDiscriminant> = D extends string + ? D + : D extends Discriminant + ? Parsed + : never; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts new file mode 100644 index 000000000000..509658e0eb3d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts @@ -0,0 +1,176 @@ +import { type BaseSchema, type MaybeValid, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { keys } from "../../utils/keys.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { enum_ } from "../enum/index.js"; +import type { ObjectSchema } from "../object/index.js"; +import { getObjectLikeUtils, type ObjectLikeSchema } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { Discriminant } from "./discriminant.js"; +import type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types.js"; + +export function union, U extends UnionSubtypes>( + discriminant: D, + union: U, +): ObjectLikeSchema, inferParsedUnion> { + const rawDiscriminant = + typeof discriminant === "string" ? discriminant : (discriminant.rawDiscriminant as inferRawDiscriminant); + const parsedDiscriminant = + typeof discriminant === "string" + ? discriminant + : (discriminant.parsedDiscriminant as inferParsedDiscriminant); + + const discriminantValueSchema = enum_(keys(union) as string[]); + + const baseSchema: BaseSchema, inferParsedUnion> = { + parse: (raw, opts) => { + return transformAndValidateUnion({ + value: raw, + discriminant: rawDiscriminant, + transformedDiscriminant: parsedDiscriminant, + transformDiscriminantValue: (discriminantValue) => + discriminantValueSchema.parse(discriminantValue, { + allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawDiscriminant], + }), + getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], + allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, + transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => + additionalPropertiesSchema.parse(additionalProperties, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return transformAndValidateUnion({ + value: parsed, + discriminant: parsedDiscriminant, + transformedDiscriminant: rawDiscriminant, + transformDiscriminantValue: (discriminantValue) => + discriminantValueSchema.json(discriminantValue, { + allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedDiscriminant], + }), + getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], + allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, + transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => + additionalPropertiesSchema.json(additionalProperties, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.UNION, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + }; +} + +function transformAndValidateUnion< + TransformedDiscriminant extends string, + TransformedDiscriminantValue extends string, + TransformedAdditionalProperties, +>({ + value, + discriminant, + transformedDiscriminant, + transformDiscriminantValue, + getAdditionalPropertiesSchema, + allowUnrecognizedUnionMembers = false, + transformAdditionalProperties, + breadcrumbsPrefix = [], +}: { + value: unknown; + discriminant: string; + transformedDiscriminant: TransformedDiscriminant; + transformDiscriminantValue: (discriminantValue: unknown) => MaybeValid; + getAdditionalPropertiesSchema: (discriminantValue: string) => ObjectSchema | undefined; + allowUnrecognizedUnionMembers: boolean | undefined; + transformAdditionalProperties: ( + additionalProperties: unknown, + additionalPropertiesSchema: ObjectSchema, + ) => MaybeValid; + breadcrumbsPrefix: string[] | undefined; +}): MaybeValid & TransformedAdditionalProperties> { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const { [discriminant]: discriminantValue, ...additionalProperties } = value; + + if (discriminantValue == null) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: `Missing discriminant ("${discriminant}")`, + }, + ], + }; + } + + const transformedDiscriminantValue = transformDiscriminantValue(discriminantValue); + if (!transformedDiscriminantValue.ok) { + return { + ok: false, + errors: transformedDiscriminantValue.errors, + }; + } + + const additionalPropertiesSchema = getAdditionalPropertiesSchema(transformedDiscriminantValue.value); + + if (additionalPropertiesSchema == null) { + if (allowUnrecognizedUnionMembers) { + return { + ok: true, + value: { + [transformedDiscriminant]: transformedDiscriminantValue.value, + ...additionalProperties, + } as Record & TransformedAdditionalProperties, + }; + } else { + return { + ok: false, + errors: [ + { + path: [...breadcrumbsPrefix, discriminant], + message: "Unexpected discriminant value", + }, + ], + }; + } + } + + const transformedAdditionalProperties = transformAdditionalProperties( + additionalProperties, + additionalPropertiesSchema, + ); + if (!transformedAdditionalProperties.ok) { + return transformedAdditionalProperties; + } + + return { + ok: true, + value: { + [transformedDiscriminant]: discriminantValue, + ...transformedAdditionalProperties.value, + } as Record & TransformedAdditionalProperties, + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts new file mode 100644 index 000000000000..befac2e3bebc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts @@ -0,0 +1,2 @@ +export * from "./builders/index.js"; +export type { inferParsed, inferRaw, Schema, SchemaOptions } from "./Schema.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts new file mode 100644 index 000000000000..9cd354b3418e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts @@ -0,0 +1 @@ +export type MaybePromise = T | Promise; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts new file mode 100644 index 000000000000..59f9e658867b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts @@ -0,0 +1,9 @@ +export type addQuestionMarksToNullableProperties = { + [K in OptionalKeys]?: T[K]; +} & Pick>; + +export type OptionalKeys = { + [K in keyof T]-?: undefined extends T[K] ? K : never; +}[keyof T]; + +export type RequiredKeys = Exclude>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts new file mode 100644 index 000000000000..9aa4ed5029a0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts @@ -0,0 +1,21 @@ +import { getSchemaUtils } from "../builders/schema-utils/index.js"; +import type { BaseSchema, MaybeValid, Schema, SchemaOptions, SchemaType } from "../Schema.js"; +import { maybeSkipValidation } from "./maybeSkipValidation.js"; + +export function createIdentitySchemaCreator( + schemaType: SchemaType, + validate: (value: unknown, opts?: SchemaOptions) => MaybeValid, +): () => Schema { + return () => { + const baseSchema: BaseSchema = { + parse: validate, + json: validate, + getType: () => schemaType, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts new file mode 100644 index 000000000000..2d5c93d657ce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts @@ -0,0 +1,3 @@ +export function entries(object: T): [keyof T, T[keyof T]][] { + return Object.entries(object) as [keyof T, T[keyof T]][]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts new file mode 100644 index 000000000000..70527d10013b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts @@ -0,0 +1,13 @@ +export function filterObject(obj: T, keysToInclude: K[]): Pick { + const keysToIncludeSet = new Set(keysToInclude); + return Object.entries(obj).reduce( + (acc, [key, value]) => { + if (keysToIncludeSet.has(key as K)) { + acc[key as K] = value as T[K]; + } + return acc; + // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter + }, + {} as Pick, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts new file mode 100644 index 000000000000..1a5c31027ce9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts @@ -0,0 +1,25 @@ +export function getErrorMessageForIncorrectType(value: unknown, expectedType: string): string { + return `Expected ${expectedType}. Received ${getTypeAsString(value)}.`; +} + +function getTypeAsString(value: unknown): string { + if (Array.isArray(value)) { + return "list"; + } + if (value === null) { + return "null"; + } + if (value instanceof BigInt) { + return "BigInt"; + } + switch (typeof value) { + case "string": + return `"${value}"`; + case "bigint": + case "number": + case "boolean": + case "undefined": + return `${value}`; + } + return typeof value; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts new file mode 100644 index 000000000000..db82a722c35b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts @@ -0,0 +1,17 @@ +// borrowed from https://github.com/lodash/lodash/blob/master/isPlainObject.js +export function isPlainObject(value: unknown): value is Record { + if (typeof value !== "object" || value === null) { + return false; + } + + if (Object.getPrototypeOf(value) === null) { + return true; + } + + let proto = value; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + return Object.getPrototypeOf(value) === proto; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts new file mode 100644 index 000000000000..2e0930e2d70b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts @@ -0,0 +1,3 @@ +export function keys(object: T): (keyof T)[] { + return Object.keys(object) as (keyof T)[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts new file mode 100644 index 000000000000..f32d4525136d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts @@ -0,0 +1,38 @@ +import type { BaseSchema, MaybeValid, SchemaOptions } from "../Schema.js"; + +export function maybeSkipValidation, Raw, Parsed>(schema: S): S { + return { + ...schema, + json: transformAndMaybeSkipValidation(schema.json), + parse: transformAndMaybeSkipValidation(schema.parse), + }; +} + +function transformAndMaybeSkipValidation( + transform: (value: unknown, opts?: SchemaOptions) => MaybeValid, +): (value: unknown, opts?: SchemaOptions) => MaybeValid { + return (value, opts): MaybeValid => { + const transformed = transform(value, opts); + const { skipValidation = false } = opts ?? {}; + if (!transformed.ok && skipValidation) { + // biome-ignore lint/suspicious/noConsole: allow console + console.warn( + [ + "Failed to validate.", + ...transformed.errors.map( + (error) => + " - " + + (error.path.length > 0 ? `${error.path.join(".")}: ${error.message}` : error.message), + ), + ].join("\n"), + ); + + return { + ok: true, + value: value as T, + }; + } else { + return transformed; + } + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts new file mode 100644 index 000000000000..f58d6f3d35f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts @@ -0,0 +1,12 @@ +export function partition(items: readonly T[], predicate: (item: T) => boolean): [T[], T[]] { + const trueItems: T[] = [], + falseItems: T[] = []; + for (const item of items) { + if (predicate(item)) { + trueItems.push(item); + } else { + falseItems.push(item); + } + } + return [trueItems, falseItems]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts new file mode 100644 index 000000000000..9f0bdd34e0d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts @@ -0,0 +1,6 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; +export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts new file mode 100644 index 000000000000..e37f244ea60c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts new file mode 100644 index 000000000000..668b72ec3402 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, + string[] +> = core.serialization.list(core.serialization.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, + string[] +> = core.serialization.list(core.serialization.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts new file mode 100644 index 000000000000..242978c11a34 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, + Record +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, + Record +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts new file mode 100644 index 000000000000..9003c1ac3676 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, + Record +> = core.serialization.record(core.serialization.string(), core.serialization.string()); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, + Record +> = core.serialization.record(core.serialization.string(), core.serialization.string()); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts new file mode 100644 index 000000000000..b7e20374f571 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnOptional.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField | undefined +> = ObjectWithRequiredField.optional(); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnOptional.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField | undefined +> = ObjectWithRequiredField.optional(); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts new file mode 100644 index 000000000000..4792425484f1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts new file mode 100644 index 000000000000..53931f5e393e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, + Set +> = core.serialization.set(core.serialization.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, + Set +> = core.serialization.set(core.serialization.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..1972f5b270f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1,7 @@ +export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; +export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; +export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; +export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; +export * as getAndReturnOptional from "./getAndReturnOptional.js"; +export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; +export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..e053119b972c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1,2 @@ +export * as testDelete from "./testDelete.js"; +export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts new file mode 100644 index 000000000000..b6273278aa1f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts new file mode 100644 index 000000000000..a642aa120d8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..cd7e640937da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts @@ -0,0 +1,8 @@ +export * as container from "./container/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts new file mode 100644 index 000000000000..60f40db3f33b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, + SeedExhaustive.types.NestedObjectWithRequiredField[] +> = core.serialization.list(NestedObjectWithRequiredField); + +export declare namespace Request { + export type Raw = NestedObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..d00c4c582910 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts new file mode 100644 index 000000000000..c82dda746e5a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts new file mode 100644 index 000000000000..da8888318c5b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..b30603cae602 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1,4 @@ +export * as getWithInlinePath from "./getWithInlinePath.js"; +export * as getWithPath from "./getWithPath.js"; +export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; +export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts new file mode 100644 index 000000000000..b84b3f790f22 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.params.modifyWithInlinePath.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts new file mode 100644 index 000000000000..8369d9dae207 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts new file mode 100644 index 000000000000..eb7fdb1065fb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, + string +> = core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts new file mode 100644 index 000000000000..f51fb5f9e891 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Request { + export type Raw = boolean; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBool.Response.Raw, + boolean +> = core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts new file mode 100644 index 000000000000..08ac416d1caf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDate.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts new file mode 100644 index 000000000000..a80c46b7f418 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, + Date +> = core.serialization.date(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, + Date +> = core.serialization.date(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts new file mode 100644 index 000000000000..bba9c504ff71 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, + number +> = core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, + number +> = core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts new file mode 100644 index 000000000000..552fe3843ef9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts new file mode 100644 index 000000000000..191eda735e47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnLong.Response.Raw, + number +> = core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts new file mode 100644 index 000000000000..f75bf59ba909 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Request.Raw, + string +> = core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts new file mode 100644 index 000000000000..64875010a017 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..9805ab86b129 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1,9 @@ +export * as getAndReturnBase64 from "./getAndReturnBase64.js"; +export * as getAndReturnBool from "./getAndReturnBool.js"; +export * as getAndReturnDate from "./getAndReturnDate.js"; +export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; +export * as getAndReturnDouble from "./getAndReturnDouble.js"; +export * as getAndReturnInt from "./getAndReturnInt.js"; +export * as getAndReturnLong from "./getAndReturnLong.js"; +export * as getAndReturnString from "./getAndReturnString.js"; +export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..47e249372cff --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCategory: core.serialization.Schema< + serializers.endpoints.ErrorCategory.Raw, + SeedExhaustive.endpoints.ErrorCategory +> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); + +export declare namespace ErrorCategory { + export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..a36b10d4b362 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCode: core.serialization.Schema< + serializers.endpoints.ErrorCode.Raw, + SeedExhaustive.endpoints.ErrorCode +> = core.serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); + +export declare namespace ErrorCode { + export type Raw = + | "INTERNAL_SERVER_ERROR" + | "UNAUTHORIZED" + | "FORBIDDEN" + | "BAD_REQUEST" + | "CONFLICT" + | "GONE" + | "UNPROCESSABLE_ENTITY" + | "NOT_IMPLEMENTED" + | "BAD_GATEWAY" + | "SERVICE_UNAVAILABLE" + | "Unknown"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..59ab664d43a2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ErrorCategory } from "./ErrorCategory.js"; +import { ErrorCode } from "./ErrorCode.js"; + +export const Error_: core.serialization.ObjectSchema< + serializers.endpoints.Error_.Raw, + SeedExhaustive.endpoints.Error_ +> = core.serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: core.serialization.string().optional(), + field: core.serialization.string().optional(), +}); + +export declare namespace Error_ { + export interface Raw { + category: ErrorCategory.Raw; + code: ErrorCode.Raw; + detail?: string | null; + field?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..17af0986c151 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Error_ } from "./Error_.js"; + +export const PutResponse: core.serialization.ObjectSchema< + serializers.endpoints.PutResponse.Raw, + SeedExhaustive.endpoints.PutResponse +> = core.serialization.object({ + errors: core.serialization.list(Error_).optional(), +}); + +export declare namespace PutResponse { + export interface Raw { + errors?: Error_.Raw[] | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..66e101cdc2d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1,4 @@ +export * as noEndingSlash from "./noEndingSlash.js"; +export * as withEndingSlash from "./withEndingSlash.js"; +export * as withMixedCase from "./withMixedCase.js"; +export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts new file mode 100644 index 000000000000..2b0a2cfbfa53 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts new file mode 100644 index 000000000000..de39ec7a2a0d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts new file mode 100644 index 000000000000..ffedf860047a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts new file mode 100644 index 000000000000..8d308fd3e42f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..5d81697cccfb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../api/index.js"; +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const BadObjectRequestInfo: core.serialization.ObjectSchema< + serializers.BadObjectRequestInfo.Raw, + SeedExhaustive.BadObjectRequestInfo +> = core.serialization.object({ + message: core.serialization.string(), +}); + +export declare namespace BadObjectRequestInfo { + export interface Raw { + message: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts new file mode 100644 index 000000000000..20b614a89e2f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts @@ -0,0 +1,9 @@ +export * as endpoints from "./endpoints/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..d8c20c33277a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,23 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../api/index.js"; +import * as core from "../../../../../core/index.js"; +import type * as serializers from "../../../../index.js"; +import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; + +export const PostWithObjectBody: core.serialization.Schema< + serializers.PostWithObjectBody.Raw, + SeedExhaustive.PostWithObjectBody +> = core.serialization.object({ + string: core.serialization.string(), + integer: core.serialization.number(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +}); + +export declare namespace PostWithObjectBody { + export interface Raw { + string: string; + integer: number; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..d62a81ce61fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..549edcdba7f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts new file mode 100644 index 000000000000..8e7617816edf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..b62616349ec6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts new file mode 100644 index 000000000000..c0cba3668202 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts new file mode 100644 index 000000000000..70ac5077c6f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..fb7f25afb170 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ab35ed9023bd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithDocs: core.serialization.ObjectSchema< + serializers.types.ObjectWithDocs.Raw, + SeedExhaustive.types.ObjectWithDocs +> = core.serialization.object({ + string: core.serialization.string(), +}); + +export declare namespace ObjectWithDocs { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..96a37eda2a46 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const WeatherReport: core.serialization.Schema< + serializers.types.WeatherReport.Raw, + SeedExhaustive.types.WeatherReport +> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); + +export declare namespace WeatherReport { + export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts new file mode 100644 index 000000000000..52175f3cee16 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts @@ -0,0 +1,8 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..e8e0fd387243 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { OptionalAlias } from "./OptionalAlias.js"; + +export const DoubleOptional: core.serialization.ObjectSchema< + serializers.types.DoubleOptional.Raw, + SeedExhaustive.types.DoubleOptional +> = core.serialization.object({ + optionalAlias: OptionalAlias.optional(), +}); + +export declare namespace DoubleOptional { + export interface Raw { + optionalAlias?: (OptionalAlias.Raw | undefined) | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..c754d9aba654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< + serializers.types.NestedObjectWithOptionalField.Raw, + SeedExhaustive.types.NestedObjectWithOptionalField +> = core.serialization.object({ + string: core.serialization.string().optional(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), +}); + +export declare namespace NestedObjectWithOptionalField { + export interface Raw { + string?: string | null; + NestedObject?: ObjectWithOptionalField.Raw | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..cd443843bf86 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< + serializers.types.NestedObjectWithRequiredField.Raw, + SeedExhaustive.types.NestedObjectWithRequiredField +> = core.serialization.object({ + string: core.serialization.string(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +}); + +export declare namespace NestedObjectWithRequiredField { + export interface Raw { + string: string; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..c7426a9b9847 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithMapOfMap: core.serialization.ObjectSchema< + serializers.types.ObjectWithMapOfMap.Raw, + SeedExhaustive.types.ObjectWithMapOfMap +> = core.serialization.object({ + map: core.serialization.record( + core.serialization.string(), + core.serialization.record(core.serialization.string(), core.serialization.string()), + ), +}); + +export declare namespace ObjectWithMapOfMap { + export interface Raw { + map: Record>; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..44a200707fd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,42 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithOptionalField: core.serialization.ObjectSchema< + serializers.types.ObjectWithOptionalField.Raw, + SeedExhaustive.types.ObjectWithOptionalField +> = core.serialization.object({ + string: core.serialization.string().optional(), + integer: core.serialization.number().optional(), + long: core.serialization.number().optional(), + double: core.serialization.number().optional(), + bool: core.serialization.boolean().optional(), + datetime: core.serialization.date().optional(), + date: core.serialization.string().optional(), + uuid: core.serialization.string().optional(), + base64: core.serialization.string().optional(), + list: core.serialization.list(core.serialization.string()).optional(), + set: core.serialization.set(core.serialization.string()).optional(), + map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), + bigint: core.serialization.string().optional(), +}); + +export declare namespace ObjectWithOptionalField { + export interface Raw { + string?: string | null; + integer?: number | null; + long?: number | null; + double?: number | null; + bool?: boolean | null; + datetime?: string | null; + date?: string | null; + uuid?: string | null; + base64?: string | null; + list?: string[] | null; + set?: string[] | null; + map?: Record | null; + bigint?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..b6887e41337d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithRequiredField: core.serialization.ObjectSchema< + serializers.types.ObjectWithRequiredField.Raw, + SeedExhaustive.types.ObjectWithRequiredField +> = core.serialization.object({ + string: core.serialization.string(), +}); + +export declare namespace ObjectWithRequiredField { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..a7798d5904bf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const OptionalAlias: core.serialization.Schema< + serializers.types.OptionalAlias.Raw, + SeedExhaustive.types.OptionalAlias +> = core.serialization.string().optional(); + +export declare namespace OptionalAlias { + export type Raw = string | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..83b27d0bb69d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,30 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Cat } from "./Cat.js"; +import { Dog } from "./Dog.js"; + +export const Animal: core.serialization.Schema = + core.serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); + +export declare namespace Animal { + export type Raw = Animal.Dog | Animal.Cat; + + export interface Dog extends Dog.Raw { + animal: "dog"; + } + + export interface Cat extends Cat.Raw { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..16f8a2006e5c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Cat: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToMeow: core.serialization.boolean(), + }); + +export declare namespace Cat { + export interface Raw { + name: string; + likesToMeow: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..271a1f3a4afa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Dog: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToWoof: core.serialization.boolean(), + }); + +export declare namespace Dog { + export interface Raw { + name: string; + likesToWoof: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts new file mode 100644 index 000000000000..498f143c7283 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts @@ -0,0 +1,46 @@ +import { bigint } from "../../../../src/core/schemas/builders/bigint"; +import { itJson, itParse, itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("bigint", () => { + itSchema("converts between raw bigint and parsed bigint", bigint(), { + raw: BigInt("9007199254740992"), + parsed: BigInt("9007199254740992"), + }); + + itParse("converts between raw number and parsed bigint", bigint(), { + raw: 10, + parsed: BigInt("10"), + }); + + itParse("converts between raw number and parsed bigint", bigint(), { + raw: BigInt("10"), + parsed: BigInt("10"), + }); + + itJson("converts raw bigint to parsed bigint", bigint(), { + parsed: BigInt("10"), + raw: BigInt("10"), + }); + + itValidateParse("string", bigint(), "42", [ + { + message: 'Expected bigint | number. Received "42".', + path: [], + }, + ]); + + itValidateJson("number", bigint(), 42, [ + { + message: "Expected bigint. Received 42.", + path: [], + }, + ]); + + itValidateJson("string", bigint(), "42", [ + { + message: 'Expected bigint. Received "42".', + path: [], + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts new file mode 100644 index 000000000000..2790268a09c6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts @@ -0,0 +1,31 @@ +import { date } from "../../../../src/core/schemas/builders/date"; +import { itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("date", () => { + itSchema("converts between raw ISO string and parsed Date", date(), { + raw: "2022-09-29T05:41:21.939Z", + parsed: new Date("2022-09-29T05:41:21.939Z"), + }); + + itValidateParse("non-string", date(), 42, [ + { + message: "Expected string. Received 42.", + path: [], + }, + ]); + + itValidateParse("non-ISO", date(), "hello world", [ + { + message: 'Expected ISO 8601 date string. Received "hello world".', + path: [], + }, + ]); + + itValidateJson("non-Date", date(), "hello", [ + { + message: 'Expected Date object. Received "hello".', + path: [], + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts new file mode 100644 index 000000000000..d1707325b29b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts @@ -0,0 +1,30 @@ +import { enum_ } from "../../../../src/core/schemas/builders/enum"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("enum", () => { + itSchemaIdentity(enum_(["A", "B", "C"]), "A"); + + itSchemaIdentity(enum_(["A", "B", "C"]), "D" as any, { + opts: { allowUnrecognizedEnumValues: true }, + }); + + itValidate("invalid enum", enum_(["A", "B", "C"]), "D", [ + { + message: 'Expected enum. Received "D".', + path: [], + }, + ]); + + itValidate( + "non-string", + enum_(["A", "B", "C"]), + [], + [ + { + message: "Expected string. Received list.", + path: [], + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts new file mode 100644 index 000000000000..a82ace4a08c0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts @@ -0,0 +1,57 @@ +import { lazy, list, object, string } from "../../../../src/core/schemas/builders"; +import type { Schema } from "../../../../src/core/schemas/Schema"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("lazy", () => { + it("doesn't run immediately", () => { + let wasRun = false; + lazy(() => { + wasRun = true; + return string(); + }); + expect(wasRun).toBe(false); + }); + + it("only runs first time", async () => { + let count = 0; + const schema = lazy(() => { + count++; + return string(); + }); + await schema.parse("hello"); + await schema.json("world"); + expect(count).toBe(1); + }); + + itSchemaIdentity( + lazy(() => object({})), + { foo: "hello" }, + { + title: "passes opts through", + opts: { unrecognizedObjectKeys: "passthrough" }, + }, + ); + + itSchemaIdentity( + lazy(() => object({ foo: string() })), + { foo: "hello" }, + ); + + // eslint-disable-next-line vi/expect-expect + it("self-referencial schema doesn't compile", () => { + () => { + // @ts-expect-error + const a = lazy(() => object({ foo: a })); + }; + }); + + // eslint-disable-next-line vi/expect-expect + it("self-referencial compiles with explicit type", () => { + () => { + interface TreeNode { + children: TreeNode[]; + } + const TreeNode: Schema = lazy(() => object({ children: list(TreeNode) })); + }; + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts new file mode 100644 index 000000000000..9b443671a71f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts @@ -0,0 +1,18 @@ +import { lazyObject, number, object, string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("lazy", () => { + itSchemaIdentity( + lazyObject(() => object({ foo: string() })), + { foo: "hello" }, + ); + + itSchemaIdentity( + lazyObject(() => object({ foo: string() })).extend(object({ bar: number() })), + { + foo: "hello", + bar: 42, + }, + { title: "returned schema has object utils" }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts new file mode 100644 index 000000000000..8b7d5e40cfaf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts @@ -0,0 +1,7 @@ +import { object } from "../../../../../src/core/schemas/builders/object"; +import { schemaB } from "./b"; + +// @ts-expect-error +export const schemaA = object({ + b: schemaB, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts new file mode 100644 index 000000000000..fb219d54c8e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts @@ -0,0 +1,8 @@ +import { object } from "../../../../../src/core/schemas/builders/object"; +import { optional } from "../../../../../src/core/schemas/builders/schema-utils"; +import { schemaA } from "./a"; + +// @ts-expect-error +export const schemaB = object({ + a: optional(schemaA), +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts new file mode 100644 index 000000000000..108789b7317d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts @@ -0,0 +1,41 @@ +import { list, object, property, string } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("list", () => { + itSchemaIdentity(list(string()), ["hello", "world"], { + title: "functions as identity when item type is primitive", + }); + + itSchema( + "converts objects correctly", + list( + object({ + helloWorld: property("hello_world", string()), + }), + ), + { + raw: [{ hello_world: "123" }], + parsed: [{ helloWorld: "123" }], + }, + ); + + itValidate("not a list", list(string()), 42, [ + { + path: [], + message: "Expected list. Received 42.", + }, + ]); + + itValidate( + "invalid item type", + list(string()), + [42], + [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts new file mode 100644 index 000000000000..fa6c88873c61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts @@ -0,0 +1,21 @@ +import { stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("stringLiteral", () => { + itSchemaIdentity(stringLiteral("A"), "A"); + + itValidate("incorrect string", stringLiteral("A"), "B", [ + { + path: [], + message: 'Expected "A". Received "B".', + }, + ]); + + itValidate("non-string", stringLiteral("A"), 42, [ + { + path: [], + message: 'Expected "A". Received 42.', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts new file mode 100644 index 000000000000..b18bc9d3e5df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts @@ -0,0 +1,57 @@ +import { object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; + +describe("withParsedProperties", () => { + it("Added properties included on parsed object", async () => { + const schema = object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }).withParsedProperties({ + printFoo: (parsed) => () => parsed.foo, + printHelloWorld: () => () => "Hello world", + helloWorld: "Hello world", + }); + + const parsed = await schema.parse({ raw_foo: "value of foo", bar: "bar" }); + if (!parsed.ok) { + throw new Error("Failed to parse"); + } + expect(parsed.value.printFoo()).toBe("value of foo"); + expect(parsed.value.printHelloWorld()).toBe("Hello world"); + expect(parsed.value.helloWorld).toBe("Hello world"); + }); + + it("Added property is removed on raw object", async () => { + const schema = object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }).withParsedProperties({ + printFoo: (parsed) => () => parsed.foo, + }); + + const original = { raw_foo: "value of foo", bar: "bar" } as const; + const parsed = await schema.parse(original); + if (!parsed.ok) { + throw new Error("Failed to parse()"); + } + + const raw = await schema.json(parsed.value); + + if (!raw.ok) { + throw new Error("Failed to json()"); + } + + expect(raw.value).toEqual(original); + }); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with non-object schema", () => { + () => + object({ + foo: string(), + }) + // @ts-expect-error + .withParsedProperties(42); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts new file mode 100644 index 000000000000..b6c2920f4d3e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts @@ -0,0 +1,89 @@ +import { boolean, object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; + +describe("extend", () => { + itSchemaIdentity( + object({ + foo: string(), + }).extend( + object({ + bar: stringLiteral("bar"), + }), + ), + { + foo: "", + bar: "bar", + } as const, + { + title: "extended properties are included in schema", + }, + ); + + itSchemaIdentity( + object({ + foo: string(), + }) + .extend( + object({ + bar: stringLiteral("bar"), + }), + ) + .extend( + object({ + baz: boolean(), + }), + ), + { + foo: "", + bar: "bar", + baz: true, + } as const, + { + title: "extensions can be extended", + }, + ); + + itSchema( + "converts nested object", + object({ + item: object({ + helloWorld: property("hello_world", string()), + }), + }).extend( + object({ + goodbye: property("goodbye_raw", string()), + }), + ), + { + raw: { item: { hello_world: "yo" }, goodbye_raw: "peace" }, + parsed: { item: { helloWorld: "yo" }, goodbye: "peace" }, + }, + ); + + itSchema( + "extensions work with raw/parsed property name conversions", + object({ + item: property("item_raw", string()), + }).extend( + object({ + goodbye: property("goodbye_raw", string()), + }), + ), + { + raw: { item_raw: "hi", goodbye_raw: "peace" }, + parsed: { item: "hi", goodbye: "peace" }, + }, + ); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with non-object schema", () => { + () => + object({ + foo: string(), + }) + // @ts-expect-error + .extend([]); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts new file mode 100644 index 000000000000..a8d9fe0a1359 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts @@ -0,0 +1,255 @@ +import { any, number, object, property, string, stringLiteral, unknown } from "../../../../src/core/schemas/builders"; +import { itJson, itParse, itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("object", () => { + itSchemaIdentity( + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { + foo: "", + bar: "bar", + }, + { + title: "functions as identity when values are primitives and property() isn't used", + }, + ); + + itSchema( + "uses raw key from property()", + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { raw_foo: "foo", bar: "bar" }, + parsed: { foo: "foo", bar: "bar" }, + }, + ); + + itSchema( + "keys with unknown type can be omitted", + object({ + foo: unknown(), + }), + { + raw: {}, + parsed: {}, + }, + ); + + itSchema( + "keys with any type can be omitted", + object({ + foo: any(), + }), + { + raw: {}, + parsed: {}, + }, + ); + + describe("unrecognizedObjectKeys", () => { + describe("parse", () => { + itParse( + 'includes unknown values when unrecognizedObjectKeys === "passthrough"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "passthrough", + }, + }, + ); + + itParse( + 'strips unknown values when unrecognizedObjectKeys === "strip"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + }, + opts: { + unrecognizedObjectKeys: "strip", + }, + }, + ); + }); + + describe("json", () => { + itJson( + 'includes unknown values when unrecognizedObjectKeys === "passthrough"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "passthrough", + }, + }, + ); + + itJson( + 'strips unknown values when unrecognizedObjectKeys === "strip"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "strip", + }, + }, + ); + }); + }); + + describe("nullish properties", () => { + itSchema("missing properties are not added", object({ foo: property("raw_foo", string().optional()) }), { + raw: {}, + parsed: {}, + }); + + itSchema("undefined properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }); + + itSchema("null properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }); + + describe("extensions", () => { + itSchema( + "undefined properties are not dropped", + object({}).extend(object({ foo: property("raw_foo", string().optional()) })), + { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }, + ); + + describe("parse()", () => { + itParse( + "null properties are not dropped", + object({}).extend(object({ foo: property("raw_foo", string().optional()) })), + { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }, + ); + }); + }); + }); + + itValidate( + "missing property", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { foo: "hello" }, + [ + { + path: [], + message: 'Missing required key "bar"', + }, + ], + ); + + itValidate( + "extra property", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { foo: "hello", bar: "bar", baz: 42 }, + [ + { + path: ["baz"], + message: 'Unexpected key "baz"', + }, + ], + ); + + itValidate( + "not an object", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate( + "nested validation error", + object({ + foo: object({ + bar: number(), + }), + }), + { foo: { bar: "hello" } }, + [ + { + path: ["foo", "bar"], + message: 'Expected number. Received "hello".', + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts new file mode 100644 index 000000000000..efcd83afae79 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts @@ -0,0 +1,21 @@ +import { objectWithoutOptionalProperties, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; + +describe("objectWithoutOptionalProperties", () => { + itSchema( + "all properties are required", + objectWithoutOptionalProperties({ + foo: string(), + bar: stringLiteral("bar").optional(), + }), + { + raw: { + foo: "hello", + }, + // @ts-expect-error + parsed: { + foo: "hello", + }, + }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts new file mode 100644 index 000000000000..c8770fca17dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts @@ -0,0 +1,87 @@ +import { object, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itJson, itParse, itSchema } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("passthrough", () => { + const baseSchema = object({ + foo: string(), + bar: stringLiteral("bar"), + }); + + describe("parse", () => { + itParse("includes unknown values", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + baz: "extra", + }, + parsed: { + foo: "hello", + bar: "bar", + baz: "extra", + }, + }); + + itValidate( + "preserves schema validation", + baseSchema.passthrough(), + { + foo: 123, + bar: "bar", + baz: "extra", + }, + [ + { + path: ["foo"], + message: "Expected string. Received 123.", + }, + ], + ); + }); + + describe("json", () => { + itJson("includes unknown values", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + + baz: "extra", + }, + parsed: { + foo: "hello", + bar: "bar", + + baz: "extra", + }, + }); + + itValidate( + "preserves schema validation", + baseSchema.passthrough(), + { + foo: "hello", + bar: "wrong", + baz: "extra", + }, + [ + { + path: ["bar"], + message: 'Expected "bar". Received "wrong".', + }, + ], + ); + }); + + itSchema("preserves schema validation in both directions", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + extra: 42, + }, + parsed: { + foo: "hello", + bar: "bar", + extra: 42, + }, + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts new file mode 100644 index 000000000000..1adbbe2a8380 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts @@ -0,0 +1,6 @@ +import { any } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("any", () => { + itSchemaIdentity(any(), true); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts new file mode 100644 index 000000000000..897a8295dca7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts @@ -0,0 +1,14 @@ +import { boolean } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("boolean", () => { + itSchemaIdentity(boolean(), true); + + itValidate("non-boolean", boolean(), {}, [ + { + path: [], + message: "Expected boolean. Received object.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts new file mode 100644 index 000000000000..1d18eba052ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts @@ -0,0 +1,54 @@ +import { never } from "../../../../src/core/schemas/builders"; + +describe("never", () => { + it("always fails to parse", () => { + const schema = never(); + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("always fails to json", () => { + const schema = never(); + const result = schema.json("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("fails with any value including undefined", () => { + const schema = never(); + expect(schema.parse(undefined).ok).toBe(false); + expect(schema.parse(null).ok).toBe(false); + expect(schema.parse(0).ok).toBe(false); + expect(schema.parse("").ok).toBe(false); + expect(schema.parse({}).ok).toBe(false); + expect(schema.parse([]).ok).toBe(false); + }); + + it("works when called without options parameter", () => { + const schema = never(); + // This tests that the default = {} parameter works correctly + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + expect(result.errors[0]?.path).toEqual([]); + } + }); + + it("succeeds with skipValidation", () => { + const schema = never(); + const result = schema.parse("test", { skipValidation: true }); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.value).toBe("test"); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts new file mode 100644 index 000000000000..2d01415a60ba --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts @@ -0,0 +1,14 @@ +import { number } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("number", () => { + itSchemaIdentity(number(), 42); + + itValidate("non-number", number(), "hello", [ + { + path: [], + message: 'Expected number. Received "hello".', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts new file mode 100644 index 000000000000..57b2368784ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts @@ -0,0 +1,14 @@ +import { string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("string", () => { + itSchemaIdentity(string(), "hello"); + + itValidate("non-string", string(), 42, [ + { + path: [], + message: "Expected string. Received 42.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts new file mode 100644 index 000000000000..4d17a7dbd005 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts @@ -0,0 +1,6 @@ +import { unknown } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("unknown", () => { + itSchemaIdentity(unknown(), true); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts new file mode 100644 index 000000000000..e07f3e7cb00d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts @@ -0,0 +1,34 @@ +import { number, record, string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("record", () => { + itSchemaIdentity(record(string(), string()), { hello: "world" }); + itSchemaIdentity(record(number(), string()), { 42: "world" }); + + itValidate( + "non-record", + record(number(), string()), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate("invalid key type", record(number(), string()), { hello: "world" }, [ + { + path: ["hello (key)"], + message: 'Expected number. Received "hello".', + }, + ]); + + itValidate("invalid value type", record(string(), number()), { hello: "world" }, [ + { + path: ["hello"], + message: 'Expected number. Received "world".', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts new file mode 100644 index 000000000000..822c3ca4e5a4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts @@ -0,0 +1,83 @@ +import { object, string } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; + +describe("getSchemaUtils", () => { + describe("optional()", () => { + itSchema("optional fields allow original schema", string().optional(), { + raw: "hello", + parsed: "hello", + }); + + itSchema("optional fields are not required", string().optional(), { + raw: null, + parsed: undefined, + }); + }); + + describe("transform()", () => { + itSchema( + "transform and untransform run correctly", + string().transform({ + transform: (x) => `${x}X`, + untransform: (x) => (x as string).slice(0, -1), + }), + { + raw: "hello", + parsed: "helloX", + }, + ); + }); + + describe("parseOrThrow()", () => { + it("parses valid value", async () => { + const value = string().parseOrThrow("hello"); + expect(value).toBe("hello"); + }); + + it("throws on invalid value", async () => { + const value = () => object({ a: string(), b: string() }).parseOrThrow({ a: 24 }); + expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); + }); + }); + + describe("jsonOrThrow()", () => { + it("serializes valid value", async () => { + const value = string().jsonOrThrow("hello"); + expect(value).toBe("hello"); + }); + + it("throws on invalid value", async () => { + const value = () => object({ a: string(), b: string() }).jsonOrThrow({ a: 24 }); + expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); + }); + }); + + describe("omitUndefined", () => { + it("serializes undefined as null", async () => { + const value = object({ + a: string().optional(), + b: string().optional(), + }).jsonOrThrow({ + a: "hello", + b: undefined, + }); + expect(value).toEqual({ a: "hello", b: null }); + }); + + it("omits undefined values", async () => { + const value = object({ + a: string().optional(), + b: string().optional(), + }).jsonOrThrow( + { + a: "hello", + b: undefined, + }, + { + omitUndefined: true, + }, + ); + expect(value).toEqual({ a: "hello" }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts new file mode 100644 index 000000000000..13842ff40157 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts @@ -0,0 +1,78 @@ +import { + boolean, + discriminant, + list, + number, + object, + string, + stringLiteral, + union, +} from "../../../src/core/schemas/builders"; +import { booleanLiteral } from "../../../src/core/schemas/builders/literals/booleanLiteral"; +import { property } from "../../../src/core/schemas/builders/object/property"; +import { itSchema } from "./utils/itSchema"; + +describe("Schema", () => { + itSchema( + "large nested object", + object({ + a: string(), + b: stringLiteral("b value"), + c: property( + "raw_c", + list( + object({ + animal: union(discriminant("type", "_type"), { + dog: object({ value: boolean() }), + cat: object({ value: property("raw_cat", number()) }), + }), + }), + ), + ), + d: property("raw_d", boolean()), + e: booleanLiteral(true), + }), + { + raw: { + a: "hello", + b: "b value", + raw_c: [ + { + animal: { + _type: "dog", + value: true, + }, + }, + { + animal: { + _type: "cat", + raw_cat: 42, + }, + }, + ], + raw_d: false, + e: true, + }, + parsed: { + a: "hello", + b: "b value", + c: [ + { + animal: { + type: "dog", + value: true, + }, + }, + { + animal: { + type: "cat", + value: 42, + }, + }, + ], + d: false, + e: true, + }, + }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts new file mode 100644 index 000000000000..53a1652c8bbb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts @@ -0,0 +1,48 @@ +import { set, string } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("set", () => { + itSchema("converts between raw list and parsed Set", set(string()), { + raw: ["A", "B"], + parsed: new Set(["A", "B"]), + }); + + itValidateParse("not a list", set(string()), 42, [ + { + path: [], + message: "Expected list. Received 42.", + }, + ]); + + itValidateJson( + "not a Set", + set(string()), + [], + [ + { + path: [], + message: "Expected Set. Received list.", + }, + ], + ); + + itValidateParse( + "invalid item type", + set(string()), + [42], + [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ], + ); + + itValidateJson("invalid item type", set(string()), new Set([42]), [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts new file mode 100644 index 000000000000..3283555949ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts @@ -0,0 +1,44 @@ +/* eslint-disable no-console */ +import { boolean, number, object, property, string, undiscriminatedUnion } from "../../../src/core/schemas/builders"; + +describe("skipValidation", () => { + it("allows data that doesn't conform to the schema", async () => { + const warningLogs: string[] = []; + const originalConsoleWarn = console.warn; + console.warn = (...args) => warningLogs.push(args.join(" ")); + + const schema = object({ + camelCase: property("snake_case", string()), + numberProperty: number(), + requiredProperty: boolean(), + anyPrimitive: undiscriminatedUnion([string(), number(), boolean()]), + }); + + const parsed = await schema.parse( + { + snake_case: "hello", + numberProperty: "oops", + anyPrimitive: true, + }, + { + skipValidation: true, + }, + ); + + expect(parsed).toEqual({ + ok: true, + value: { + camelCase: "hello", + numberProperty: "oops", + anyPrimitive: true, + }, + }); + + expect(warningLogs).toEqual([ + `Failed to validate. + - numberProperty: Expected number. Received "oops".`, + ]); + + console.warn = originalConsoleWarn; + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts new file mode 100644 index 000000000000..01dcadbba37b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts @@ -0,0 +1,44 @@ +import { number, object, property, string, undiscriminatedUnion } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; + +describe("undiscriminatedUnion", () => { + itSchemaIdentity(undiscriminatedUnion([string(), number()]), "hello world"); + + itSchemaIdentity(undiscriminatedUnion([object({ hello: string() }), object({ goodbye: string() })]), { + goodbye: "foo", + }); + + itSchema( + "Correctly transforms", + undiscriminatedUnion([object({ hello: string() }), object({ helloWorld: property("hello_world", string()) })]), + { + raw: { hello_world: "foo " }, + parsed: { helloWorld: "foo " }, + }, + ); + + it("Returns errors for all variants", async () => { + const result = await undiscriminatedUnion([string(), number()]).parse(true); + if (result.ok) { + throw new Error("Unexpectedly passed validation"); + } + expect(result.errors).toEqual([ + { + message: "[Variant 0] Expected string. Received true.", + path: [], + }, + { + message: "[Variant 1] Expected number. Received true.", + path: [], + }, + ]); + }); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with zero members", () => { + // @ts-expect-error + () => undiscriminatedUnion([]); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts new file mode 100644 index 000000000000..1f5d7a8fad5c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts @@ -0,0 +1,113 @@ +import { boolean, discriminant, number, object, string, union } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("union", () => { + itSchemaIdentity( + union("type", { + lion: object({ + meows: boolean(), + }), + giraffe: object({ + heightInInches: number(), + }), + }), + { type: "lion", meows: true }, + { title: "doesn't transform discriminant when it's a string" }, + ); + + itSchema( + "transforms discriminant when it's a discriminant()", + union(discriminant("type", "_type"), { + lion: object({ meows: boolean() }), + giraffe: object({ heightInInches: number() }), + }), + { + raw: { _type: "lion", meows: true }, + parsed: { type: "lion", meows: true }, + }, + ); + + describe("allowUnrecognizedUnionMembers", () => { + itSchema( + "transforms discriminant & passes through values when discriminant value is unrecognized", + union(discriminant("type", "_type"), { + lion: object({ meows: boolean() }), + giraffe: object({ heightInInches: number() }), + }), + { + // @ts-expect-error + raw: { _type: "moose", isAMoose: true }, + // @ts-expect-error + parsed: { type: "moose", isAMoose: true }, + opts: { + allowUnrecognizedUnionMembers: true, + }, + }, + ); + }); + + describe("withParsedProperties", () => { + it("Added property is included on parsed object", async () => { + const schema = union("type", { + lion: object({}), + tiger: object({ value: string() }), + }).withParsedProperties({ + printType: (parsed) => () => parsed.type, + }); + + const parsed = await schema.parse({ type: "lion" }); + if (!parsed.ok) { + throw new Error("Failed to parse"); + } + expect(parsed.value.printType()).toBe("lion"); + }); + }); + + itValidate( + "non-object", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate( + "missing discriminant", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + {}, + [ + { + path: [], + message: 'Missing discriminant ("type")', + }, + ], + ); + + itValidate( + "unrecognized discriminant value", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + { + type: "bear", + }, + [ + { + path: ["type"], + message: 'Expected enum. Received "bear".', + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts new file mode 100644 index 000000000000..25b13e643207 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts @@ -0,0 +1,78 @@ +/* eslint-disable vi/no-export */ +import type { Schema, SchemaOptions } from "../../../../src/core/schemas/Schema"; + +export function itSchemaIdentity( + schema: Schema, + value: T, + { title = "functions as identity", opts }: { title?: string; opts?: SchemaOptions } = {}, +): void { + itSchema(title, schema, { raw: value, parsed: value, opts }); +} + +export function itSchema( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + only = false, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + only?: boolean; + }, +): void { + // eslint-disable-next-line vi/valid-title + (only ? describe.only : describe)(title, () => { + itParse("parse()", schema, { raw, parsed, opts }); + itJson("json()", schema, { raw, parsed, opts }); + }); +} + +export function itParse( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + }, +): void { + // eslint-disable-next-line vi/valid-title + it(title, () => { + const maybeValid = schema.parse(raw, opts); + if (!maybeValid.ok) { + throw new Error(`Failed to parse() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); + } + expect(maybeValid.value).toStrictEqual(parsed); + }); +} + +export function itJson( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + }, +): void { + // eslint-disable-next-line vi/valid-title + it(title, () => { + const maybeValid = schema.json(parsed, opts); + if (!maybeValid.ok) { + throw new Error(`Failed to json() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); + } + expect(maybeValid.value).toStrictEqual(raw); + }); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts new file mode 100644 index 000000000000..60bc56c123cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts @@ -0,0 +1,56 @@ +/* eslint-disable vi/no-export */ +import type { Schema, SchemaOptions, ValidationError } from "../../../../src/core/schemas/Schema"; + +export function itValidate( + title: string, + schema: Schema, + input: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + // eslint-disable-next-line vi/valid-title + describe("parse()", () => { + itValidateParse(title, schema, input, errors, opts); + }); + describe("json()", () => { + itValidateJson(title, schema, input, errors, opts); + }); +} + +export function itValidateParse( + title: string, + schema: Schema, + raw: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + describe("parse", () => { + // eslint-disable-next-line vi/valid-title + it(title, async () => { + const maybeValid = await schema.parse(raw, opts); + if (maybeValid.ok) { + throw new Error("Value passed validation"); + } + expect(maybeValid.errors).toStrictEqual(errors); + }); + }); +} + +export function itValidateJson( + title: string, + schema: Schema, + parsed: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + describe("json", () => { + // eslint-disable-next-line vi/valid-title + it(title, async () => { + const maybeValid = await schema.json(parsed, opts); + if (maybeValid.ok) { + throw new Error("Value passed validation"); + } + expect(maybeValid.errors).toStrictEqual(errors); + }); + }); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..98b9ec0c58b9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + expect(response).toEqual(new Set(["string"])); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..4bc8916f7ce5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..b9e26c032ff9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..685826602e5e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..650fc620bb1d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..61b5a64bce8f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..8f5f6a59a512 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a128d4844ba2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); From 2494bccf0ba8eb45e1bfe206cae8ada28ac01d0c Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 12:45:52 -0500 Subject: [PATCH 67/71] linting --- .../utils/commons/src/serialization-pipeline/formats/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts index cd35a4821491..8f9dab57bf37 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/formats/index.ts @@ -1,3 +1,3 @@ export { PassthroughFormat } from "./PassthroughFormat"; -export { ZodFormat, ZOD_VERSION } from "./ZodFormat"; +export { ZOD_VERSION, ZodFormat } from "./ZodFormat"; export { ZURG_MANIFEST, ZurgFormat } from "./ZurgFormat"; From e52556329552a2e58fb575b8b36693d39b0006f8 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 12:50:47 -0500 Subject: [PATCH 68/71] fixed missing namespace in tests --- .../__tests__/ZurgFormat.test.ts | 22 +-- .../__snapshots__/ZurgBaseline.test.ts.snap | 132 +++++++++--------- .../__snapshots__/ZurgFormat.test.ts.snap | 46 +++--- 3 files changed, 100 insertions(+), 100 deletions(-) diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts index 19fecf3e45eb..01fbdb0dd8dd 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/ZurgFormat.test.ts @@ -59,59 +59,59 @@ describe("ZurgFormat AST Generation", () => { describe("Primitive Schemas", () => { it("string() generates correct AST", () => { const ast = printNode(zurg.string().toExpression()); - expect(ast).toBe("serialization.string()"); + expect(ast).toBe("core.serialization.string()"); }); it("number() generates correct AST", () => { const ast = printNode(zurg.number().toExpression()); - expect(ast).toBe("serialization.number()"); + expect(ast).toBe("core.serialization.number()"); }); it("boolean() generates correct AST", () => { const ast = printNode(zurg.boolean().toExpression()); - expect(ast).toBe("serialization.boolean()"); + expect(ast).toBe("core.serialization.boolean()"); }); it("bigint() generates correct AST", () => { const ast = printNode(zurg.bigint().toExpression()); - expect(ast).toBe("serialization.bigint()"); + expect(ast).toBe("core.serialization.bigint()"); }); it("date() generates correct AST", () => { const ast = printNode(zurg.date().toExpression()); - expect(ast).toBe("serialization.date()"); + expect(ast).toBe("core.serialization.date()"); }); it("any() generates correct AST", () => { const ast = printNode(zurg.any().toExpression()); - expect(ast).toBe("serialization.any()"); + expect(ast).toBe("core.serialization.any()"); }); it("unknown() generates correct AST", () => { const ast = printNode(zurg.unknown().toExpression()); - expect(ast).toBe("serialization.unknown()"); + expect(ast).toBe("core.serialization.unknown()"); }); it("never() generates correct AST", () => { const ast = printNode(zurg.never().toExpression()); - expect(ast).toBe("serialization.never()"); + expect(ast).toBe("core.serialization.never()"); }); }); describe("Literal Schemas", () => { it("stringLiteral() generates correct AST", () => { const ast = printNode(zurg.stringLiteral("hello").toExpression()); - expect(ast).toBe('serialization.stringLiteral("hello")'); + expect(ast).toBe('core.serialization.stringLiteral("hello")'); }); it("booleanLiteral(true) generates correct AST", () => { const ast = printNode(zurg.booleanLiteral(true).toExpression()); - expect(ast).toBe("serialization.booleanLiteral(true)"); + expect(ast).toBe("core.serialization.booleanLiteral(true)"); }); it("booleanLiteral(false) generates correct AST", () => { const ast = printNode(zurg.booleanLiteral(false).toExpression()); - expect(ast).toBe("serialization.booleanLiteral(false)"); + expect(ast).toBe("core.serialization.booleanLiteral(false)"); }); }); diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap index 62293a768413..0022d9053d5f 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgBaseline.test.ts.snap @@ -1,43 +1,43 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`ZurgFormat AST Generation Baseline > Collection Schemas > list() generates correct AST 1`] = `"serialization.list(serialization.string())"`; +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > list() generates correct AST 1`] = `"core.serialization.list(core.serialization.string())"`; -exports[`ZurgFormat AST Generation Baseline > Collection Schemas > nested list generates correct AST 1`] = `"serialization.list(serialization.list(serialization.string()))"`; +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > nested list generates correct AST 1`] = `"core.serialization.list(core.serialization.list(core.serialization.string()))"`; -exports[`ZurgFormat AST Generation Baseline > Collection Schemas > record() generates correct AST 1`] = `"serialization.record(serialization.string(), serialization.number())"`; +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > record() generates correct AST 1`] = `"core.serialization.record(core.serialization.string(), core.serialization.number())"`; -exports[`ZurgFormat AST Generation Baseline > Collection Schemas > set() generates correct AST 1`] = `"serialization.set(serialization.number())"`; +exports[`ZurgFormat AST Generation Baseline > Collection Schemas > set() generates correct AST 1`] = `"core.serialization.set(core.serialization.number())"`; exports[`ZurgFormat AST Generation Baseline > Complex Nested Schemas > deeply nested object generates correct AST 1`] = ` -"serialization.object({ - "user": serialization.object({ - "profile": serialization.object({ - "name": serialization.string(), - "age": serialization.number().optional() +"core.serialization.object({ + "user": core.serialization.object({ + "profile": core.serialization.object({ + "name": core.serialization.string(), + "age": core.serialization.number().optional() }) }), - "tags": serialization.list(serialization.string()), - "metadata": serialization.record(serialization.string(), serialization.any()) + "tags": core.serialization.list(core.serialization.string()), + "metadata": core.serialization.record(core.serialization.string(), core.serialization.any()) })" `; -exports[`ZurgFormat AST Generation Baseline > Enum Schemas > enum with multiple values generates correct AST 1`] = `"serialization.enum_(["ACTIVE", "INACTIVE", "PENDING"])"`; +exports[`ZurgFormat AST Generation Baseline > Enum Schemas > enum with multiple values generates correct AST 1`] = `"core.serialization.enum_(["ACTIVE", "INACTIVE", "PENDING"])"`; -exports[`ZurgFormat AST Generation Baseline > Enum Schemas > enum with single value generates correct AST 1`] = `"serialization.enum_(["ACTIVE"])"`; +exports[`ZurgFormat AST Generation Baseline > Enum Schemas > enum with single value generates correct AST 1`] = `"core.serialization.enum_(["ACTIVE"])"`; -exports[`ZurgFormat AST Generation Baseline > Lazy Schemas (for recursion) > lazy() generates correct AST 1`] = `"serialization.lazy(() => serialization.string())"`; +exports[`ZurgFormat AST Generation Baseline > Lazy Schemas (for recursion) > lazy() generates correct AST 1`] = `"core.serialization.lazy(() => core.serialization.string())"`; exports[`ZurgFormat AST Generation Baseline > Lazy Schemas (for recursion) > lazyObject() generates correct AST 1`] = ` -"serialization.lazyObject(() => serialization.object({ - "id": serialization.string() +"core.serialization.lazyObject(() => core.serialization.object({ + "id": core.serialization.string() }))" `; -exports[`ZurgFormat AST Generation Baseline > Literal Schemas > booleanLiteral(false) generates correct AST 1`] = `"serialization.booleanLiteral(false)"`; +exports[`ZurgFormat AST Generation Baseline > Literal Schemas > booleanLiteral(false) generates correct AST 1`] = `"core.serialization.booleanLiteral(false)"`; -exports[`ZurgFormat AST Generation Baseline > Literal Schemas > booleanLiteral(true) generates correct AST 1`] = `"serialization.booleanLiteral(true)"`; +exports[`ZurgFormat AST Generation Baseline > Literal Schemas > booleanLiteral(true) generates correct AST 1`] = `"core.serialization.booleanLiteral(true)"`; -exports[`ZurgFormat AST Generation Baseline > Literal Schemas > stringLiteral() generates correct AST 1`] = `"serialization.stringLiteral("hello")"`; +exports[`ZurgFormat AST Generation Baseline > Literal Schemas > stringLiteral() generates correct AST 1`] = `"core.serialization.stringLiteral("hello")"`; exports[`ZurgFormat AST Generation Baseline > MaybeValid Visitor > _visitMaybeValid generates correct AST 1`] = ` "{ @@ -50,95 +50,95 @@ exports[`ZurgFormat AST Generation Baseline > MaybeValid Visitor > _visitMaybeVa }" `; -exports[`ZurgFormat AST Generation Baseline > Object Schemas > empty object generates correct AST 1`] = `"serialization.object({})"`; +exports[`ZurgFormat AST Generation Baseline > Object Schemas > empty object generates correct AST 1`] = `"core.serialization.object({})"`; exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with different raw/parsed keys generates correct AST 1`] = ` -"serialization.object({ - "firstName": serialization.property("first_name", serialization.string()), - "lastName": serialization.property("last_name", serialization.string()) +"core.serialization.object({ + "firstName": core.serialization.property("first_name", core.serialization.string()), + "lastName": core.serialization.property("last_name", core.serialization.string()) })" `; exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with nullable property generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string().nullable() +"core.serialization.object({ + "name": core.serialization.string().nullable() })" `; exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with optional property generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string(), - "nickname": serialization.string().optional() +"core.serialization.object({ + "name": core.serialization.string(), + "nickname": core.serialization.string().optional() })" `; exports[`ZurgFormat AST Generation Baseline > Object Schemas > object with same raw/parsed keys generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string(), - "age": serialization.number() +"core.serialization.object({ + "name": core.serialization.string(), + "age": core.serialization.number() })" `; exports[`ZurgFormat AST Generation Baseline > Object Schemas > object.extend() generates correct AST 1`] = ` -"serialization.object({ - "id": serialization.string() -}).extend(serialization.object({ - "name": serialization.string() +"core.serialization.object({ + "id": core.serialization.string() +}).extend(core.serialization.object({ + "name": core.serialization.string() }))" `; exports[`ZurgFormat AST Generation Baseline > Object Schemas > object.passthrough() generates correct AST 1`] = ` -"serialization.object({ - "id": serialization.string() +"core.serialization.object({ + "id": core.serialization.string() }).passthrough()" `; exports[`ZurgFormat AST Generation Baseline > Object Schemas > objectWithoutOptionalProperties generates correct AST 1`] = ` -"serialization.objectWithoutOptionalProperties({ - "id": serialization.string() +"core.serialization.objectWithoutOptionalProperties({ + "id": core.serialization.string() })" `; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > any() generates correct AST 1`] = `"serialization.any()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > any() generates correct AST 1`] = `"core.serialization.any()"`; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > bigint() generates correct AST 1`] = `"serialization.bigint()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > bigint() generates correct AST 1`] = `"core.serialization.bigint()"`; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > boolean() generates correct AST 1`] = `"serialization.boolean()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > boolean() generates correct AST 1`] = `"core.serialization.boolean()"`; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > date() generates correct AST 1`] = `"serialization.date()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > date() generates correct AST 1`] = `"core.serialization.date()"`; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > never() generates correct AST 1`] = `"serialization.never()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > never() generates correct AST 1`] = `"core.serialization.never()"`; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > number() generates correct AST 1`] = `"serialization.number()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > number() generates correct AST 1`] = `"core.serialization.number()"`; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > string() generates correct AST 1`] = `"serialization.string()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > string() generates correct AST 1`] = `"core.serialization.string()"`; -exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > unknown() generates correct AST 1`] = `"serialization.unknown()"`; +exports[`ZurgFormat AST Generation Baseline > Primitive Schemas > unknown() generates correct AST 1`] = `"core.serialization.unknown()"`; -exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > nullable() generates correct AST 1`] = `"serialization.string().nullable()"`; +exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > nullable() generates correct AST 1`] = `"core.serialization.string().nullable()"`; -exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > optional() generates correct AST 1`] = `"serialization.string().optional()"`; +exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > optional() generates correct AST 1`] = `"core.serialization.string().optional()"`; -exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"serialization.string().optionalNullable()"`; +exports[`ZurgFormat AST Generation Baseline > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"core.serialization.string().optionalNullable()"`; -exports[`ZurgFormat AST Generation Baseline > Schema Operations > json() generates correct AST 1`] = `"serialization.string().json(parsedValue)"`; +exports[`ZurgFormat AST Generation Baseline > Schema Operations > json() generates correct AST 1`] = `"core.serialization.string().json(parsedValue)"`; -exports[`ZurgFormat AST Generation Baseline > Schema Operations > jsonOrThrow() generates correct AST 1`] = `"serialization.string().jsonOrThrow(parsedValue)"`; +exports[`ZurgFormat AST Generation Baseline > Schema Operations > jsonOrThrow() generates correct AST 1`] = `"core.serialization.string().jsonOrThrow(parsedValue)"`; -exports[`ZurgFormat AST Generation Baseline > Schema Operations > parse() generates correct AST 1`] = `"serialization.string().parse(rawValue)"`; +exports[`ZurgFormat AST Generation Baseline > Schema Operations > parse() generates correct AST 1`] = `"core.serialization.string().parse(rawValue)"`; exports[`ZurgFormat AST Generation Baseline > Schema Operations > parse() with skipValidation generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string() +"core.serialization.object({ + "name": core.serialization.string() }).parse(rawValue, { unrecognizedObjectKeys: "passthrough", allowUnrecognizedUnionMembers: true, allowUnrecognizedEnumValues: true, skipValidation: true, omitUndefined: true, breadcrumbsPrefix: ["request"] })" `; -exports[`ZurgFormat AST Generation Baseline > Schema Operations > parseOrThrow() generates correct AST 1`] = `"serialization.string().parseOrThrow(rawValue)"`; +exports[`ZurgFormat AST Generation Baseline > Schema Operations > parseOrThrow() generates correct AST 1`] = `"core.serialization.string().parseOrThrow(rawValue)"`; -exports[`ZurgFormat AST Generation Baseline > Type References > ObjectSchema._getReferenceToType generates correct AST 1`] = `"serialization.ObjectSchema<{}, {}>"`; +exports[`ZurgFormat AST Generation Baseline > Type References > ObjectSchema._getReferenceToType generates correct AST 1`] = `"core.serialization.ObjectSchema<{}, {}>"`; exports[`ZurgFormat AST Generation Baseline > Type References > Schema._getReferenceToType generates correct AST 1`] = ` -"serialization.Schema<{ +"core.serialization.Schema<{ name: string; }, { name: string; @@ -146,20 +146,20 @@ exports[`ZurgFormat AST Generation Baseline > Type References > Schema._getRefer `; exports[`ZurgFormat AST Generation Baseline > Union Schemas > discriminated union generates correct AST 1`] = ` -"serialization.union("type", { - "dog": serialization.object({ - "breed": serialization.string() +"core.serialization.union("type", { + "dog": core.serialization.object({ + "breed": core.serialization.string() }), - "cat": serialization.object({ - "indoor": serialization.boolean() + "cat": core.serialization.object({ + "indoor": core.serialization.boolean() }) })" `; -exports[`ZurgFormat AST Generation Baseline > Union Schemas > undiscriminatedUnion generates correct AST 1`] = `"serialization.undiscriminatedUnion([serialization.string(), serialization.number(), serialization.boolean()])"`; +exports[`ZurgFormat AST Generation Baseline > Union Schemas > undiscriminatedUnion generates correct AST 1`] = `"core.serialization.undiscriminatedUnion([core.serialization.string(), core.serialization.number(), core.serialization.boolean()])"`; exports[`ZurgFormat AST Generation Baseline > Union Schemas > union with different raw/parsed discriminant generates correct AST 1`] = ` -"serialization.union(serialization.discriminant("animalType", "animal_type"), { - "dog": serialization.object({}) +"core.serialization.union(core.serialization.discriminant("animalType", "animal_type"), { + "dog": core.serialization.object({}) })" `; diff --git a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap index 91df575331ef..35431a5fcd42 100644 --- a/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap +++ b/generators/typescript/utils/commons/src/serialization-pipeline/__tests__/__snapshots__/ZurgFormat.test.ts.snap @@ -1,52 +1,52 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`ZurgFormat AST Generation > Collection Schemas > list(string()) generates correct AST 1`] = `"serialization.list(serialization.string())"`; +exports[`ZurgFormat AST Generation > Collection Schemas > list(string()) generates correct AST 1`] = `"core.serialization.list(core.serialization.string())"`; -exports[`ZurgFormat AST Generation > Collection Schemas > record(string, any) generates correct AST 1`] = `"serialization.record(serialization.string(), serialization.any())"`; +exports[`ZurgFormat AST Generation > Collection Schemas > record(string, any) generates correct AST 1`] = `"core.serialization.record(core.serialization.string(), core.serialization.any())"`; -exports[`ZurgFormat AST Generation > Collection Schemas > set(number()) generates correct AST 1`] = `"serialization.set(serialization.number())"`; +exports[`ZurgFormat AST Generation > Collection Schemas > set(number()) generates correct AST 1`] = `"core.serialization.set(core.serialization.number())"`; -exports[`ZurgFormat AST Generation > Enum Schema > enum with values generates correct AST 1`] = `"serialization.enum_(["A", "B", "C"])"`; +exports[`ZurgFormat AST Generation > Enum Schema > enum with values generates correct AST 1`] = `"core.serialization.enum_(["A", "B", "C"])"`; -exports[`ZurgFormat AST Generation > Lazy Schemas > lazy() generates correct AST 1`] = `"serialization.lazy(() => serialization.string())"`; +exports[`ZurgFormat AST Generation > Lazy Schemas > lazy() generates correct AST 1`] = `"core.serialization.lazy(() => core.serialization.string())"`; exports[`ZurgFormat AST Generation > Lazy Schemas > lazyObject() generates correct AST 1`] = ` -"serialization.lazyObject(() => serialization.object({ - "id": serialization.string() +"core.serialization.lazyObject(() => core.serialization.object({ + "id": core.serialization.string() }))" `; -exports[`ZurgFormat AST Generation > Object Schemas > empty object generates correct AST 1`] = `"serialization.object({})"`; +exports[`ZurgFormat AST Generation > Object Schemas > empty object generates correct AST 1`] = `"core.serialization.object({})"`; exports[`ZurgFormat AST Generation > Object Schemas > object with different raw/parsed keys generates correct AST 1`] = ` -"serialization.object({ - "firstName": serialization.property("first_name", serialization.string()), - "lastName": serialization.property("last_name", serialization.string()) +"core.serialization.object({ + "firstName": core.serialization.property("first_name", core.serialization.string()), + "lastName": core.serialization.property("last_name", core.serialization.string()) })" `; exports[`ZurgFormat AST Generation > Object Schemas > object with same raw/parsed keys generates correct AST 1`] = ` -"serialization.object({ - "name": serialization.string(), - "age": serialization.number() +"core.serialization.object({ + "name": core.serialization.string(), + "age": core.serialization.number() })" `; -exports[`ZurgFormat AST Generation > Schema Modifiers > nullable() generates correct AST 1`] = `"serialization.string().nullable()"`; +exports[`ZurgFormat AST Generation > Schema Modifiers > nullable() generates correct AST 1`] = `"core.serialization.string().nullable()"`; -exports[`ZurgFormat AST Generation > Schema Modifiers > optional() generates correct AST 1`] = `"serialization.string().optional()"`; +exports[`ZurgFormat AST Generation > Schema Modifiers > optional() generates correct AST 1`] = `"core.serialization.string().optional()"`; -exports[`ZurgFormat AST Generation > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"serialization.string().optionalNullable()"`; +exports[`ZurgFormat AST Generation > Schema Modifiers > optionalNullable() generates correct AST 1`] = `"core.serialization.string().optionalNullable()"`; exports[`ZurgFormat AST Generation > Union Schemas > discriminated union generates correct AST 1`] = ` -"serialization.union("type", { - "dog": serialization.object({ - "breed": serialization.string() +"core.serialization.union("type", { + "dog": core.serialization.object({ + "breed": core.serialization.string() }), - "cat": serialization.object({ - "indoor": serialization.boolean() + "cat": core.serialization.object({ + "indoor": core.serialization.boolean() }) })" `; -exports[`ZurgFormat AST Generation > Union Schemas > undiscriminated union generates correct AST 1`] = `"serialization.undiscriminatedUnion([serialization.string(), serialization.number(), serialization.boolean()])"`; +exports[`ZurgFormat AST Generation > Union Schemas > undiscriminated union generates correct AST 1`] = `"core.serialization.undiscriminatedUnion([core.serialization.string(), core.serialization.number(), core.serialization.boolean()])"`; From 33dbc40e0964eb42f576a5c5218dbc41efd5a740 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 13:10:01 -0500 Subject: [PATCH 69/71] fixed express error --- generators/typescript/express/generator/src/ExpressGenerator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/typescript/express/generator/src/ExpressGenerator.ts b/generators/typescript/express/generator/src/ExpressGenerator.ts index 12f3526fbe09..a7a4e5c6339f 100644 --- a/generators/typescript/express/generator/src/ExpressGenerator.ts +++ b/generators/typescript/express/generator/src/ExpressGenerator.ts @@ -528,7 +528,7 @@ export class ExpressGenerator { this.context.logger.debug(`Generating ${filepathStr}`); const sourceFile = this.rootDirectory.createSourceFile(filepathStr); - const importsManager = new ImportsManager({ packagePath: this.config.packagePath }); + const importsManager = new ImportsManager({ packagePath: this.getRelativePackagePath() }); run({ sourceFile, importsManager }); From 653ae9232b8b764dbc49f255fc3529be0ad56a72 Mon Sep 17 00:00:00 2001 From: Brendan Conron Date: Sat, 6 Dec 2025 13:25:04 -0500 Subject: [PATCH 70/71] removed generated seed tests for pr review --- .../serde-layer-none/.fern/metadata.json | 8 - .../serde-layer-none/.github/workflows/ci.yml | 78 - .../exhaustive/serde-layer-none/.gitignore | 3 - .../serde-layer-none/CONTRIBUTING.md | 133 - .../exhaustive/serde-layer-none/README.md | 241 -- .../exhaustive/serde-layer-none/biome.json | 74 - .../exhaustive/serde-layer-none/package.json | 66 - .../serde-layer-none/pnpm-workspace.yaml | 1 - .../exhaustive/serde-layer-none/reference.md | 2761 ----------------- .../scripts/rename-to-esm-files.js | 123 - .../exhaustive/serde-layer-none/snippet.json | 544 ---- .../serde-layer-none/src/BaseClient.ts | 82 - .../exhaustive/serde-layer-none/src/Client.ts | 48 - .../serde-layer-none/src/api/index.ts | 1 - .../api/resources/endpoints/client/Client.ts | 76 - .../api/resources/endpoints/client/index.ts | 1 - .../src/api/resources/endpoints/index.ts | 2 - .../resources/container/client/Client.ts | 458 --- .../resources/container/client/index.ts | 1 - .../endpoints/resources/container/index.ts | 1 - .../resources/contentType/client/Client.ts | 171 - .../resources/contentType/client/index.ts | 1 - .../endpoints/resources/contentType/index.ts | 1 - .../endpoints/resources/enum/client/Client.ts | 80 - .../endpoints/resources/enum/client/index.ts | 1 - .../endpoints/resources/enum/index.ts | 1 - .../resources/httpMethods/client/Client.ts | 334 -- .../resources/httpMethods/client/index.ts | 1 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 13 - .../resources/object/client/Client.ts | 522 ---- .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../resources/params/client/Client.ts | 522 ---- .../resources/params/client/index.ts | 1 - .../client/requests/GetWithInlinePath.ts | 11 - .../requests/GetWithInlinePathAndQuery.ts | 13 - .../client/requests/GetWithMultipleQuery.ts | 13 - .../client/requests/GetWithPathAndQuery.ts | 11 - .../params/client/requests/GetWithQuery.ts | 13 - .../requests/ModifyResourceAtInlinedPath.ts | 13 - .../resources/params/client/requests/index.ts | 6 - .../endpoints/resources/params/index.ts | 1 - .../resources/primitive/client/Client.ts | 535 ---- .../resources/primitive/client/index.ts | 1 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/client/Client.ts | 80 - .../endpoints/resources/put/client/index.ts | 1 - .../put/client/requests/PutRequest.ts | 11 - .../resources/put/client/requests/index.ts | 1 - .../endpoints/resources/put/index.ts | 2 - .../resources/put/types/ErrorCategory.ts | 8 - .../resources/put/types/ErrorCode.ts | 16 - .../endpoints/resources/put/types/Error_.ts | 10 - .../resources/put/types/PutResponse.ts | 7 - .../endpoints/resources/put/types/index.ts | 4 - .../resources/union/client/Client.ts | 84 - .../endpoints/resources/union/client/index.ts | 1 - .../endpoints/resources/union/index.ts | 1 - .../endpoints/resources/urls/client/Client.ts | 210 -- .../endpoints/resources/urls/client/index.ts | 1 - .../endpoints/resources/urls/index.ts | 1 - .../generalErrors/errors/BadRequestBody.ts | 22 - .../resources/generalErrors/errors/index.ts | 1 - .../src/api/resources/generalErrors/index.ts | 2 - .../types/BadObjectRequestInfo.ts | 5 - .../resources/generalErrors/types/index.ts | 1 - .../src/api/resources/index.ts | 11 - .../inlinedRequests/client/Client.ts | 110 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 33 - .../inlinedRequests/client/requests/index.ts | 1 - .../api/resources/inlinedRequests/index.ts | 1 - .../src/api/resources/noAuth/client/Client.ts | 89 - .../src/api/resources/noAuth/client/index.ts | 1 - .../src/api/resources/noAuth/index.ts | 1 - .../api/resources/noReqBody/client/Client.ts | 126 - .../api/resources/noReqBody/client/index.ts | 1 - .../src/api/resources/noReqBody/index.ts | 1 - .../resources/reqWithHeaders/client/Client.ts | 93 - .../resources/reqWithHeaders/client/index.ts | 1 - .../client/requests/ReqWithHeaders.ts | 15 - .../reqWithHeaders/client/requests/index.ts | 1 - .../src/api/resources/reqWithHeaders/index.ts | 1 - .../src/api/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 66 - .../types/resources/docs/types/index.ts | 1 - .../enum/errors/ErrorWithEnumBody.ts | 22 - .../types/resources/enum/errors/index.ts | 1 - .../resources/types/resources/enum/index.ts | 2 - .../resources/enum/types/WeatherReport.ts | 9 - .../types/resources/enum/types/index.ts | 1 - .../api/resources/types/resources/index.ts | 11 - .../NestedObjectWithOptionalFieldError.ts | 22 - .../NestedObjectWithRequiredFieldError.ts | 22 - .../errors/ObjectWithOptionalFieldError.ts | 22 - .../errors/ObjectWithRequiredFieldError.ts | 22 - .../types/resources/object/errors/index.ts | 4 - .../resources/types/resources/object/index.ts | 2 - .../resources/object/types/DoubleOptional.ts | 7 - .../types/NestedObjectWithOptionalField.ts | 8 - .../types/NestedObjectWithRequiredField.ts | 8 - .../object/types/ObjectWithMapOfMap.ts | 5 - .../object/types/ObjectWithOptionalField.ts | 18 - .../object/types/ObjectWithRequiredField.ts | 5 - .../resources/object/types/OptionalAlias.ts | 3 - .../types/resources/object/types/index.ts | 7 - .../union/errors/ErrorWithUnionBody.ts | 22 - .../types/resources/union/errors/index.ts | 1 - .../resources/types/resources/union/index.ts | 2 - .../types/resources/union/types/Animal.ts | 15 - .../types/resources/union/types/Cat.ts | 6 - .../types/resources/union/types/Dog.ts | 6 - .../types/resources/union/types/index.ts | 3 - .../src/auth/BearerAuthProvider.ts | 35 - .../serde-layer-none/src/auth/index.ts | 1 - .../src/core/auth/AuthProvider.ts | 6 - .../src/core/auth/AuthRequest.ts | 9 - .../src/core/auth/BasicAuth.ts | 32 - .../src/core/auth/BearerToken.ts | 20 - .../src/core/auth/NoOpAuthProvider.ts | 8 - .../serde-layer-none/src/core/auth/index.ts | 5 - .../serde-layer-none/src/core/base64.ts | 27 - .../serde-layer-none/src/core/exports.ts | 1 - .../src/core/fetcher/APIResponse.ts | 23 - .../src/core/fetcher/BinaryResponse.ts | 34 - .../src/core/fetcher/EndpointMetadata.ts | 13 - .../src/core/fetcher/EndpointSupplier.ts | 14 - .../src/core/fetcher/Fetcher.ts | 391 --- .../src/core/fetcher/Headers.ts | 93 - .../src/core/fetcher/HttpResponsePromise.ts | 116 - .../src/core/fetcher/RawResponse.ts | 61 - .../src/core/fetcher/Supplier.ts | 11 - .../src/core/fetcher/createRequestUrl.ts | 6 - .../src/core/fetcher/getErrorResponseBody.ts | 33 - .../src/core/fetcher/getFetchFn.ts | 3 - .../src/core/fetcher/getHeader.ts | 8 - .../src/core/fetcher/getRequestBody.ts | 20 - .../src/core/fetcher/getResponseBody.ts | 58 - .../src/core/fetcher/index.ts | 11 - .../src/core/fetcher/makeRequest.ts | 42 - .../src/core/fetcher/requestWithRetries.ts | 64 - .../src/core/fetcher/signals.ts | 26 - .../serde-layer-none/src/core/headers.ts | 35 - .../serde-layer-none/src/core/index.ts | 6 - .../serde-layer-none/src/core/json.ts | 27 - .../src/core/logging/exports.ts | 19 - .../src/core/logging/index.ts | 1 - .../src/core/logging/logger.ts | 203 -- .../src/core/runtime/index.ts | 1 - .../src/core/runtime/runtime.ts | 134 - .../src/core/url/encodePathParam.ts | 18 - .../serde-layer-none/src/core/url/index.ts | 3 - .../serde-layer-none/src/core/url/join.ts | 79 - .../serde-layer-none/src/core/url/qs.ts | 74 - .../src/errors/SeedExhaustiveError.ts | 58 - .../src/errors/SeedExhaustiveTimeoutError.ts | 13 - .../src/errors/handleNonStatusCodeError.ts | 37 - .../serde-layer-none/src/errors/index.ts | 2 - .../serde-layer-none/src/exports.ts | 1 - .../exhaustive/serde-layer-none/src/index.ts | 5 - .../serde-layer-none/src/version.ts | 1 - .../serde-layer-none/tests/custom.test.ts | 13 - .../tests/mock-server/MockServer.ts | 29 - .../tests/mock-server/MockServerPool.ts | 106 - .../tests/mock-server/mockEndpointBuilder.ts | 227 -- .../tests/mock-server/randomBaseUrl.ts | 4 - .../tests/mock-server/setup.ts | 10 - .../tests/mock-server/withFormUrlEncoded.ts | 80 - .../tests/mock-server/withHeaders.ts | 70 - .../tests/mock-server/withJson.ts | 158 - .../serde-layer-none/tests/setup.ts | 80 - .../serde-layer-none/tests/tsconfig.json | 11 - .../tests/unit/auth/BasicAuth.test.ts | 92 - .../tests/unit/auth/BearerToken.test.ts | 14 - .../tests/unit/base64.test.ts | 53 - .../tests/unit/fetcher/Fetcher.test.ts | 261 -- .../unit/fetcher/HttpResponsePromise.test.ts | 143 - .../tests/unit/fetcher/RawResponse.test.ts | 34 - .../unit/fetcher/createRequestUrl.test.ts | 163 - .../tests/unit/fetcher/getRequestBody.test.ts | 129 - .../unit/fetcher/getResponseBody.test.ts | 97 - .../tests/unit/fetcher/logging.test.ts | 517 --- .../tests/unit/fetcher/makeRequest.test.ts | 54 - .../tests/unit/fetcher/redacting.test.ts | 1115 ------- .../unit/fetcher/requestWithRetries.test.ts | 230 -- .../tests/unit/fetcher/signals.test.ts | 69 - .../tests/unit/fetcher/test-file.txt | 1 - .../tests/unit/logging/logger.test.ts | 454 --- .../tests/unit/url/join.test.ts | 284 -- .../tests/unit/url/qs.test.ts | 278 -- .../serde-layer-none/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 - .../tests/wire/endpoints/contentType.test.ts | 88 - .../tests/wire/endpoints/enum.test.ts | 24 - .../tests/wire/endpoints/httpMethods.test.ts | 212 -- .../tests/wire/endpoints/object.test.ts | 448 --- .../tests/wire/endpoints/params.test.ts | 120 - .../tests/wire/endpoints/primitive.test.ts | 168 - .../tests/wire/endpoints/put.test.ts | 39 - .../tests/wire/endpoints/union.test.ts | 32 - .../tests/wire/endpoints/urls.test.ts | 68 - .../tests/wire/inlinedRequests.test.ts | 150 - .../tests/wire/noAuth.test.ts | 48 - .../tests/wire/noReqBody.test.ts | 58 - .../tests/wire/reqWithHeaders.test.ts | 29 - .../serde-layer-none/tsconfig.base.json | 18 - .../serde-layer-none/tsconfig.cjs.json | 9 - .../serde-layer-none/tsconfig.esm.json | 10 - .../exhaustive/serde-layer-none/tsconfig.json | 3 - .../serde-layer-none/vitest.config.mts | 28 - .../serde-layer-zod/.fern/metadata.json | 8 - .../serde-layer-zod/.github/workflows/ci.yml | 78 - .../exhaustive/serde-layer-zod/.gitignore | 3 - .../serde-layer-zod/CONTRIBUTING.md | 133 - .../exhaustive/serde-layer-zod/README.md | 241 -- .../exhaustive/serde-layer-zod/biome.json | 74 - .../exhaustive/serde-layer-zod/package.json | 80 - .../serde-layer-zod/pnpm-workspace.yaml | 1 - .../exhaustive/serde-layer-zod/reference.md | 2761 ----------------- .../scripts/rename-to-esm-files.js | 123 - .../exhaustive/serde-layer-zod/snippet.json | 544 ---- .../serde-layer-zod/src/BaseClient.ts | 82 - .../exhaustive/serde-layer-zod/src/Client.ts | 48 - .../serde-layer-zod/src/api/index.ts | 1 - .../api/resources/endpoints/client/Client.ts | 76 - .../api/resources/endpoints/client/index.ts | 1 - .../src/api/resources/endpoints/index.ts | 2 - .../resources/container/client/Client.ts | 477 --- .../resources/container/client/index.ts | 1 - .../endpoints/resources/container/index.ts | 1 - .../resources/contentType/client/Client.ts | 172 - .../resources/contentType/client/index.ts | 1 - .../endpoints/resources/contentType/index.ts | 1 - .../endpoints/resources/enum/client/Client.ts | 84 - .../endpoints/resources/enum/client/index.ts | 1 - .../endpoints/resources/enum/index.ts | 1 - .../resources/httpMethods/client/Client.ts | 341 -- .../resources/httpMethods/client/index.ts | 1 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 13 - .../resources/object/client/Client.ts | 523 ---- .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../resources/params/client/Client.ts | 535 ---- .../resources/params/client/index.ts | 1 - .../client/requests/GetWithInlinePath.ts | 11 - .../requests/GetWithInlinePathAndQuery.ts | 13 - .../client/requests/GetWithMultipleQuery.ts | 13 - .../client/requests/GetWithPathAndQuery.ts | 11 - .../params/client/requests/GetWithQuery.ts | 13 - .../requests/ModifyResourceAtInlinedPath.ts | 13 - .../resources/params/client/requests/index.ts | 6 - .../endpoints/resources/params/index.ts | 1 - .../resources/primitive/client/Client.ts | 563 ---- .../resources/primitive/client/index.ts | 1 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/client/Client.ts | 84 - .../endpoints/resources/put/client/index.ts | 1 - .../put/client/requests/PutRequest.ts | 11 - .../resources/put/client/requests/index.ts | 1 - .../endpoints/resources/put/index.ts | 2 - .../resources/put/types/ErrorCategory.ts | 8 - .../resources/put/types/ErrorCode.ts | 16 - .../endpoints/resources/put/types/Error_.ts | 10 - .../resources/put/types/PutResponse.ts | 7 - .../endpoints/resources/put/types/index.ts | 4 - .../resources/union/client/Client.ts | 85 - .../endpoints/resources/union/client/index.ts | 1 - .../endpoints/resources/union/index.ts | 1 - .../endpoints/resources/urls/client/Client.ts | 223 -- .../endpoints/resources/urls/client/index.ts | 1 - .../endpoints/resources/urls/index.ts | 1 - .../generalErrors/errors/BadRequestBody.ts | 22 - .../resources/generalErrors/errors/index.ts | 1 - .../src/api/resources/generalErrors/index.ts | 2 - .../types/BadObjectRequestInfo.ts | 5 - .../resources/generalErrors/types/index.ts | 1 - .../src/api/resources/index.ts | 11 - .../inlinedRequests/client/Client.ts | 111 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 33 - .../inlinedRequests/client/requests/index.ts | 1 - .../api/resources/inlinedRequests/index.ts | 1 - .../src/api/resources/noAuth/client/Client.ts | 93 - .../src/api/resources/noAuth/client/index.ts | 1 - .../src/api/resources/noAuth/index.ts | 1 - .../api/resources/noReqBody/client/Client.ts | 130 - .../api/resources/noReqBody/client/index.ts | 1 - .../src/api/resources/noReqBody/index.ts | 1 - .../resources/reqWithHeaders/client/Client.ts | 90 - .../resources/reqWithHeaders/client/index.ts | 1 - .../client/requests/ReqWithHeaders.ts | 15 - .../reqWithHeaders/client/requests/index.ts | 1 - .../src/api/resources/reqWithHeaders/index.ts | 1 - .../src/api/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 66 - .../types/resources/docs/types/index.ts | 1 - .../enum/errors/ErrorWithEnumBody.ts | 22 - .../types/resources/enum/errors/index.ts | 1 - .../resources/types/resources/enum/index.ts | 2 - .../resources/enum/types/WeatherReport.ts | 9 - .../types/resources/enum/types/index.ts | 1 - .../api/resources/types/resources/index.ts | 11 - .../NestedObjectWithOptionalFieldError.ts | 22 - .../NestedObjectWithRequiredFieldError.ts | 22 - .../errors/ObjectWithOptionalFieldError.ts | 22 - .../errors/ObjectWithRequiredFieldError.ts | 22 - .../types/resources/object/errors/index.ts | 4 - .../resources/types/resources/object/index.ts | 2 - .../resources/object/types/DoubleOptional.ts | 7 - .../types/NestedObjectWithOptionalField.ts | 8 - .../types/NestedObjectWithRequiredField.ts | 8 - .../object/types/ObjectWithMapOfMap.ts | 5 - .../object/types/ObjectWithOptionalField.ts | 18 - .../object/types/ObjectWithRequiredField.ts | 5 - .../resources/object/types/OptionalAlias.ts | 3 - .../types/resources/object/types/index.ts | 7 - .../union/errors/ErrorWithUnionBody.ts | 22 - .../types/resources/union/errors/index.ts | 1 - .../resources/types/resources/union/index.ts | 2 - .../types/resources/union/types/Animal.ts | 15 - .../types/resources/union/types/Cat.ts | 6 - .../types/resources/union/types/Dog.ts | 6 - .../types/resources/union/types/index.ts | 3 - .../src/auth/BearerAuthProvider.ts | 35 - .../serde-layer-zod/src/auth/index.ts | 1 - .../src/core/auth/AuthProvider.ts | 6 - .../src/core/auth/AuthRequest.ts | 9 - .../src/core/auth/BasicAuth.ts | 32 - .../src/core/auth/BearerToken.ts | 20 - .../src/core/auth/NoOpAuthProvider.ts | 8 - .../serde-layer-zod/src/core/auth/index.ts | 5 - .../serde-layer-zod/src/core/base64.ts | 27 - .../serde-layer-zod/src/core/exports.ts | 1 - .../src/core/fetcher/APIResponse.ts | 23 - .../src/core/fetcher/BinaryResponse.ts | 34 - .../src/core/fetcher/EndpointMetadata.ts | 13 - .../src/core/fetcher/EndpointSupplier.ts | 14 - .../src/core/fetcher/Fetcher.ts | 391 --- .../src/core/fetcher/Headers.ts | 93 - .../src/core/fetcher/HttpResponsePromise.ts | 116 - .../src/core/fetcher/RawResponse.ts | 61 - .../src/core/fetcher/Supplier.ts | 11 - .../src/core/fetcher/createRequestUrl.ts | 6 - .../src/core/fetcher/getErrorResponseBody.ts | 33 - .../src/core/fetcher/getFetchFn.ts | 3 - .../src/core/fetcher/getHeader.ts | 8 - .../src/core/fetcher/getRequestBody.ts | 20 - .../src/core/fetcher/getResponseBody.ts | 58 - .../serde-layer-zod/src/core/fetcher/index.ts | 11 - .../src/core/fetcher/makeRequest.ts | 42 - .../src/core/fetcher/requestWithRetries.ts | 64 - .../src/core/fetcher/signals.ts | 26 - .../serde-layer-zod/src/core/headers.ts | 35 - .../serde-layer-zod/src/core/index.ts | 6 - .../serde-layer-zod/src/core/json.ts | 27 - .../src/core/logging/exports.ts | 19 - .../serde-layer-zod/src/core/logging/index.ts | 1 - .../src/core/logging/logger.ts | 203 -- .../serde-layer-zod/src/core/runtime/index.ts | 1 - .../src/core/runtime/runtime.ts | 134 - .../src/core/url/encodePathParam.ts | 18 - .../serde-layer-zod/src/core/url/index.ts | 3 - .../serde-layer-zod/src/core/url/join.ts | 79 - .../serde-layer-zod/src/core/url/qs.ts | 74 - .../src/errors/SeedExhaustiveError.ts | 58 - .../src/errors/SeedExhaustiveTimeoutError.ts | 13 - .../src/errors/handleNonStatusCodeError.ts | 37 - .../serde-layer-zod/src/errors/index.ts | 2 - .../exhaustive/serde-layer-zod/src/exports.ts | 1 - .../exhaustive/serde-layer-zod/src/index.ts | 6 - .../src/serialization/index.ts | 1 - .../resources/endpoints/index.ts | 1 - .../client/getAndReturnListOfObjects.ts | 46 - .../client/getAndReturnListOfPrimitives.ts | 34 - .../client/getAndReturnMapOfPrimToObject.ts | 47 - .../client/getAndReturnMapPrimToPrim.ts | 36 - .../container/client/getAndReturnOptional.ts | 46 - .../client/getAndReturnSetOfObjects.ts | 46 - .../client/getAndReturnSetOfPrimitives.ts | 36 - .../resources/container/client/index.ts | 7 - .../endpoints/resources/container/index.ts | 1 - .../resources/httpMethods/client/index.ts | 2 - .../httpMethods/client/testDelete.ts | 19 - .../resources/httpMethods/client/testGet.ts | 19 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 8 - ...tAndReturnNestedWithRequiredFieldAsList.ts | 26 - .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../params/client/getWithInlinePath.ts | 19 - .../resources/params/client/getWithPath.ts | 19 - .../resources/params/client/index.ts | 4 - .../params/client/modifyWithInlinePath.ts | 34 - .../resources/params/client/modifyWithPath.ts | 34 - .../endpoints/resources/params/index.ts | 1 - .../primitive/client/getAndReturnBase64.ts | 34 - .../primitive/client/getAndReturnBool.ts | 34 - .../primitive/client/getAndReturnDate.ts | 34 - .../primitive/client/getAndReturnDatetime.ts | 34 - .../primitive/client/getAndReturnDouble.ts | 34 - .../primitive/client/getAndReturnInt.ts | 34 - .../primitive/client/getAndReturnLong.ts | 34 - .../primitive/client/getAndReturnString.ts | 34 - .../primitive/client/getAndReturnUuid.ts | 34 - .../resources/primitive/client/index.ts | 9 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/index.ts | 1 - .../resources/put/types/ErrorCategory.ts | 20 - .../resources/put/types/ErrorCode.ts | 43 - .../endpoints/resources/put/types/Error_.ts | 38 - .../resources/put/types/PutResponse.ts | 33 - .../endpoints/resources/put/types/index.ts | 4 - .../endpoints/resources/urls/client/index.ts | 4 - .../resources/urls/client/noEndingSlash.ts | 19 - .../resources/urls/client/withEndingSlash.ts | 19 - .../resources/urls/client/withMixedCase.ts | 19 - .../resources/urls/client/withUnderscores.ts | 19 - .../endpoints/resources/urls/index.ts | 1 - .../resources/generalErrors/index.ts | 1 - .../types/BadObjectRequestInfo.ts | 24 - .../resources/generalErrors/types/index.ts | 1 - .../src/serialization/resources/index.ts | 9 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 40 - .../inlinedRequests/client/requests/index.ts | 1 - .../resources/inlinedRequests/index.ts | 1 - .../resources/noAuth/client/index.ts | 1 - .../resources/noAuth/client/postWithNoAuth.ts | 19 - .../serialization/resources/noAuth/index.ts | 1 - .../resources/noReqBody/client/index.ts | 1 - .../noReqBody/client/postWithNoRequestBody.ts | 19 - .../resources/noReqBody/index.ts | 1 - .../client/getWithCustomHeader.ts | 19 - .../resources/reqWithHeaders/client/index.ts | 1 - .../resources/reqWithHeaders/index.ts | 1 - .../serialization/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 24 - .../types/resources/docs/types/index.ts | 1 - .../resources/types/resources/enum/index.ts | 1 - .../resources/enum/types/WeatherReport.ts | 20 - .../types/resources/enum/types/index.ts | 1 - .../resources/types/resources/index.ts | 8 - .../resources/types/resources/object/index.ts | 1 - .../resources/object/types/DoubleOptional.ts | 33 - .../types/NestedObjectWithOptionalField.ts | 44 - .../types/NestedObjectWithRequiredField.ts | 39 - .../object/types/ObjectWithMapOfMap.ts | 24 - .../object/types/ObjectWithOptionalField.ts | 74 - .../object/types/ObjectWithRequiredField.ts | 25 - .../resources/object/types/OptionalAlias.ts | 20 - .../types/resources/object/types/index.ts | 7 - .../resources/types/resources/union/index.ts | 1 - .../types/resources/union/types/Animal.ts | 35 - .../types/resources/union/types/Cat.ts | 26 - .../types/resources/union/types/Dog.ts | 26 - .../types/resources/union/types/index.ts | 3 - .../exhaustive/serde-layer-zod/src/version.ts | 1 - .../serde-layer-zod/tests/custom.test.ts | 13 - .../tests/mock-server/MockServer.ts | 29 - .../tests/mock-server/MockServerPool.ts | 106 - .../tests/mock-server/mockEndpointBuilder.ts | 227 -- .../tests/mock-server/randomBaseUrl.ts | 4 - .../tests/mock-server/setup.ts | 10 - .../tests/mock-server/withFormUrlEncoded.ts | 80 - .../tests/mock-server/withHeaders.ts | 70 - .../tests/mock-server/withJson.ts | 158 - .../exhaustive/serde-layer-zod/tests/setup.ts | 80 - .../serde-layer-zod/tests/tsconfig.json | 11 - .../tests/unit/auth/BasicAuth.test.ts | 92 - .../tests/unit/auth/BearerToken.test.ts | 14 - .../serde-layer-zod/tests/unit/base64.test.ts | 53 - .../tests/unit/fetcher/Fetcher.test.ts | 261 -- .../unit/fetcher/HttpResponsePromise.test.ts | 143 - .../tests/unit/fetcher/RawResponse.test.ts | 34 - .../unit/fetcher/createRequestUrl.test.ts | 163 - .../tests/unit/fetcher/getRequestBody.test.ts | 129 - .../unit/fetcher/getResponseBody.test.ts | 97 - .../tests/unit/fetcher/logging.test.ts | 517 --- .../tests/unit/fetcher/makeRequest.test.ts | 54 - .../tests/unit/fetcher/redacting.test.ts | 1115 ------- .../unit/fetcher/requestWithRetries.test.ts | 230 -- .../tests/unit/fetcher/signals.test.ts | 69 - .../tests/unit/fetcher/test-file.txt | 1 - .../tests/unit/logging/logger.test.ts | 454 --- .../tests/unit/url/join.test.ts | 284 -- .../serde-layer-zod/tests/unit/url/qs.test.ts | 278 -- .../serde-layer-zod/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 - .../tests/wire/endpoints/contentType.test.ts | 88 - .../tests/wire/endpoints/enum.test.ts | 24 - .../tests/wire/endpoints/httpMethods.test.ts | 212 -- .../tests/wire/endpoints/object.test.ts | 448 --- .../tests/wire/endpoints/params.test.ts | 120 - .../tests/wire/endpoints/primitive.test.ts | 168 - .../tests/wire/endpoints/put.test.ts | 39 - .../tests/wire/endpoints/union.test.ts | 32 - .../tests/wire/endpoints/urls.test.ts | 68 - .../tests/wire/inlinedRequests.test.ts | 150 - .../serde-layer-zod/tests/wire/noAuth.test.ts | 48 - .../tests/wire/noReqBody.test.ts | 58 - .../tests/wire/reqWithHeaders.test.ts | 29 - .../serde-layer-zod/tsconfig.base.json | 18 - .../serde-layer-zod/tsconfig.cjs.json | 9 - .../serde-layer-zod/tsconfig.esm.json | 10 - .../exhaustive/serde-layer-zod/tsconfig.json | 3 - .../serde-layer-zod/vitest.config.mts | 28 - .../serde-layer-zurg/.fern/metadata.json | 8 - .../serde-layer-zurg/.github/workflows/ci.yml | 78 - .../exhaustive/serde-layer-zurg/.gitignore | 3 - .../serde-layer-zurg/CONTRIBUTING.md | 133 - .../exhaustive/serde-layer-zurg/README.md | 241 -- .../exhaustive/serde-layer-zurg/biome.json | 74 - .../exhaustive/serde-layer-zurg/package.json | 78 - .../serde-layer-zurg/pnpm-workspace.yaml | 1 - .../exhaustive/serde-layer-zurg/reference.md | 2761 ----------------- .../scripts/rename-to-esm-files.js | 123 - .../exhaustive/serde-layer-zurg/snippet.json | 544 ---- .../serde-layer-zurg/src/BaseClient.ts | 82 - .../exhaustive/serde-layer-zurg/src/Client.ts | 48 - .../serde-layer-zurg/src/api/index.ts | 1 - .../api/resources/endpoints/client/Client.ts | 76 - .../api/resources/endpoints/client/index.ts | 1 - .../src/api/resources/endpoints/index.ts | 2 - .../resources/container/client/Client.ts | 543 ---- .../resources/container/client/index.ts | 1 - .../endpoints/resources/container/index.ts | 1 - .../resources/contentType/client/Client.ts | 178 -- .../resources/contentType/client/index.ts | 1 - .../endpoints/resources/contentType/index.ts | 1 - .../endpoints/resources/enum/client/Client.ts | 93 - .../endpoints/resources/enum/client/index.ts | 1 - .../endpoints/resources/enum/index.ts | 1 - .../resources/httpMethods/client/Client.ts | 380 --- .../resources/httpMethods/client/index.ts | 1 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 13 - .../resources/object/client/Client.ts | 577 ---- .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../resources/params/client/Client.ts | 565 ---- .../resources/params/client/index.ts | 1 - .../client/requests/GetWithInlinePath.ts | 11 - .../requests/GetWithInlinePathAndQuery.ts | 13 - .../client/requests/GetWithMultipleQuery.ts | 13 - .../client/requests/GetWithPathAndQuery.ts | 11 - .../params/client/requests/GetWithQuery.ts | 13 - .../requests/ModifyResourceAtInlinedPath.ts | 13 - .../resources/params/client/requests/index.ts | 6 - .../endpoints/resources/params/index.ts | 1 - .../resources/primitive/client/Client.ts | 644 ---- .../resources/primitive/client/index.ts | 1 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/client/Client.ts | 90 - .../endpoints/resources/put/client/index.ts | 1 - .../put/client/requests/PutRequest.ts | 11 - .../resources/put/client/requests/index.ts | 1 - .../endpoints/resources/put/index.ts | 2 - .../resources/put/types/ErrorCategory.ts | 8 - .../resources/put/types/ErrorCode.ts | 16 - .../endpoints/resources/put/types/Error_.ts | 10 - .../resources/put/types/PutResponse.ts | 7 - .../endpoints/resources/put/types/index.ts | 4 - .../resources/union/client/Client.ts | 97 - .../endpoints/resources/union/client/index.ts | 1 - .../endpoints/resources/union/index.ts | 1 - .../endpoints/resources/urls/client/Client.ts | 247 -- .../endpoints/resources/urls/client/index.ts | 1 - .../endpoints/resources/urls/index.ts | 1 - .../generalErrors/errors/BadRequestBody.ts | 22 - .../resources/generalErrors/errors/index.ts | 1 - .../src/api/resources/generalErrors/index.ts | 2 - .../types/BadObjectRequestInfo.ts | 5 - .../resources/generalErrors/types/index.ts | 1 - .../src/api/resources/index.ts | 11 - .../inlinedRequests/client/Client.ts | 126 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 33 - .../inlinedRequests/client/requests/index.ts | 1 - .../api/resources/inlinedRequests/index.ts | 1 - .../src/api/resources/noAuth/client/Client.ts | 105 - .../src/api/resources/noAuth/client/index.ts | 1 - .../src/api/resources/noAuth/index.ts | 1 - .../api/resources/noReqBody/client/Client.ts | 142 - .../api/resources/noReqBody/client/index.ts | 1 - .../src/api/resources/noReqBody/index.ts | 1 - .../resources/reqWithHeaders/client/Client.ts | 93 - .../resources/reqWithHeaders/client/index.ts | 1 - .../client/requests/ReqWithHeaders.ts | 15 - .../reqWithHeaders/client/requests/index.ts | 1 - .../src/api/resources/reqWithHeaders/index.ts | 1 - .../src/api/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 66 - .../types/resources/docs/types/index.ts | 1 - .../enum/errors/ErrorWithEnumBody.ts | 22 - .../types/resources/enum/errors/index.ts | 1 - .../resources/types/resources/enum/index.ts | 2 - .../resources/enum/types/WeatherReport.ts | 9 - .../types/resources/enum/types/index.ts | 1 - .../api/resources/types/resources/index.ts | 11 - .../NestedObjectWithOptionalFieldError.ts | 22 - .../NestedObjectWithRequiredFieldError.ts | 22 - .../errors/ObjectWithOptionalFieldError.ts | 22 - .../errors/ObjectWithRequiredFieldError.ts | 22 - .../types/resources/object/errors/index.ts | 4 - .../resources/types/resources/object/index.ts | 2 - .../resources/object/types/DoubleOptional.ts | 7 - .../types/NestedObjectWithOptionalField.ts | 8 - .../types/NestedObjectWithRequiredField.ts | 8 - .../object/types/ObjectWithMapOfMap.ts | 5 - .../object/types/ObjectWithOptionalField.ts | 18 - .../object/types/ObjectWithRequiredField.ts | 5 - .../resources/object/types/OptionalAlias.ts | 3 - .../types/resources/object/types/index.ts | 7 - .../union/errors/ErrorWithUnionBody.ts | 22 - .../types/resources/union/errors/index.ts | 1 - .../resources/types/resources/union/index.ts | 2 - .../types/resources/union/types/Animal.ts | 15 - .../types/resources/union/types/Cat.ts | 6 - .../types/resources/union/types/Dog.ts | 6 - .../types/resources/union/types/index.ts | 3 - .../src/auth/BearerAuthProvider.ts | 35 - .../serde-layer-zurg/src/auth/index.ts | 1 - .../src/core/auth/AuthProvider.ts | 6 - .../src/core/auth/AuthRequest.ts | 9 - .../src/core/auth/BasicAuth.ts | 32 - .../src/core/auth/BearerToken.ts | 20 - .../src/core/auth/NoOpAuthProvider.ts | 8 - .../serde-layer-zurg/src/core/auth/index.ts | 5 - .../serde-layer-zurg/src/core/base64.ts | 27 - .../serde-layer-zurg/src/core/exports.ts | 1 - .../src/core/fetcher/APIResponse.ts | 23 - .../src/core/fetcher/BinaryResponse.ts | 34 - .../src/core/fetcher/EndpointMetadata.ts | 13 - .../src/core/fetcher/EndpointSupplier.ts | 14 - .../src/core/fetcher/Fetcher.ts | 391 --- .../src/core/fetcher/Headers.ts | 93 - .../src/core/fetcher/HttpResponsePromise.ts | 116 - .../src/core/fetcher/RawResponse.ts | 61 - .../src/core/fetcher/Supplier.ts | 11 - .../src/core/fetcher/createRequestUrl.ts | 6 - .../src/core/fetcher/getErrorResponseBody.ts | 33 - .../src/core/fetcher/getFetchFn.ts | 3 - .../src/core/fetcher/getHeader.ts | 8 - .../src/core/fetcher/getRequestBody.ts | 20 - .../src/core/fetcher/getResponseBody.ts | 58 - .../src/core/fetcher/index.ts | 11 - .../src/core/fetcher/makeRequest.ts | 42 - .../src/core/fetcher/requestWithRetries.ts | 64 - .../src/core/fetcher/signals.ts | 26 - .../serde-layer-zurg/src/core/headers.ts | 35 - .../serde-layer-zurg/src/core/index.ts | 7 - .../serde-layer-zurg/src/core/json.ts | 27 - .../src/core/logging/exports.ts | 19 - .../src/core/logging/index.ts | 1 - .../src/core/logging/logger.ts | 203 -- .../src/core/runtime/index.ts | 1 - .../src/core/runtime/runtime.ts | 134 - .../src/core/schemas/Schema.ts | 103 - .../core/schemas/builders/bigint/bigint.ts | 55 - .../src/core/schemas/builders/bigint/index.ts | 1 - .../src/core/schemas/builders/date/date.ts | 65 - .../src/core/schemas/builders/date/index.ts | 1 - .../src/core/schemas/builders/enum/enum.ts | 43 - .../src/core/schemas/builders/enum/index.ts | 1 - .../src/core/schemas/builders/index.ts | 14 - .../src/core/schemas/builders/lazy/index.ts | 3 - .../src/core/schemas/builders/lazy/lazy.ts | 32 - .../core/schemas/builders/lazy/lazyObject.ts | 20 - .../src/core/schemas/builders/list/index.ts | 1 - .../src/core/schemas/builders/list/list.ts | 73 - .../builders/literals/booleanLiteral.ts | 29 - .../core/schemas/builders/literals/index.ts | 2 - .../builders/literals/stringLiteral.ts | 29 - .../object-like/getObjectLikeUtils.ts | 79 - .../schemas/builders/object-like/index.ts | 2 - .../schemas/builders/object-like/types.ts | 13 - .../src/core/schemas/builders/object/index.ts | 22 - .../core/schemas/builders/object/object.ts | 382 --- .../object/objectWithoutOptionalProperties.ts | 23 - .../core/schemas/builders/object/property.ts | 23 - .../src/core/schemas/builders/object/types.ts | 73 - .../core/schemas/builders/primitives/any.ts | 7 - .../schemas/builders/primitives/boolean.ts | 25 - .../core/schemas/builders/primitives/index.ts | 6 - .../core/schemas/builders/primitives/never.ts | 15 - .../schemas/builders/primitives/number.ts | 25 - .../schemas/builders/primitives/string.ts | 25 - .../schemas/builders/primitives/unknown.ts | 7 - .../src/core/schemas/builders/record/index.ts | 2 - .../core/schemas/builders/record/record.ts | 129 - .../src/core/schemas/builders/record/types.ts | 17 - .../builders/schema-utils/JsonError.ts | 9 - .../builders/schema-utils/ParseError.ts | 9 - .../builders/schema-utils/getSchemaUtils.ts | 181 -- .../schemas/builders/schema-utils/index.ts | 4 - .../schema-utils/stringifyValidationErrors.ts | 8 - .../src/core/schemas/builders/set/index.ts | 1 - .../src/core/schemas/builders/set/set.ts | 43 - .../builders/undiscriminated-union/index.ts | 6 - .../builders/undiscriminated-union/types.ts | 10 - .../undiscriminatedUnion.ts | 67 - .../schemas/builders/union/discriminant.ts | 14 - .../src/core/schemas/builders/union/index.ts | 10 - .../src/core/schemas/builders/union/types.ts | 26 - .../src/core/schemas/builders/union/union.ts | 176 -- .../src/core/schemas/index.ts | 2 - .../src/core/schemas/utils/MaybePromise.ts | 1 - .../addQuestionMarksToNullableProperties.ts | 9 - .../utils/createIdentitySchemaCreator.ts | 21 - .../src/core/schemas/utils/entries.ts | 3 - .../src/core/schemas/utils/filterObject.ts | 13 - .../utils/getErrorMessageForIncorrectType.ts | 25 - .../src/core/schemas/utils/isPlainObject.ts | 17 - .../src/core/schemas/utils/keys.ts | 3 - .../core/schemas/utils/maybeSkipValidation.ts | 38 - .../src/core/schemas/utils/partition.ts | 12 - .../src/core/url/encodePathParam.ts | 18 - .../serde-layer-zurg/src/core/url/index.ts | 3 - .../serde-layer-zurg/src/core/url/join.ts | 79 - .../serde-layer-zurg/src/core/url/qs.ts | 74 - .../src/errors/SeedExhaustiveError.ts | 58 - .../src/errors/SeedExhaustiveTimeoutError.ts | 13 - .../src/errors/handleNonStatusCodeError.ts | 37 - .../serde-layer-zurg/src/errors/index.ts | 2 - .../serde-layer-zurg/src/exports.ts | 1 - .../exhaustive/serde-layer-zurg/src/index.ts | 6 - .../src/serialization/index.ts | 1 - .../resources/endpoints/index.ts | 1 - .../client/getAndReturnListOfObjects.ts | 24 - .../client/getAndReturnListOfPrimitives.ts | 22 - .../client/getAndReturnMapOfPrimToObject.ts | 24 - .../client/getAndReturnMapPrimToPrim.ts | 22 - .../container/client/getAndReturnOptional.ts | 24 - .../client/getAndReturnSetOfObjects.ts | 24 - .../client/getAndReturnSetOfPrimitives.ts | 22 - .../resources/container/client/index.ts | 7 - .../endpoints/resources/container/index.ts | 1 - .../resources/httpMethods/client/index.ts | 2 - .../httpMethods/client/testDelete.ts | 11 - .../resources/httpMethods/client/testGet.ts | 11 - .../endpoints/resources/httpMethods/index.ts | 1 - .../resources/endpoints/resources/index.ts | 8 - ...tAndReturnNestedWithRequiredFieldAsList.ts | 15 - .../resources/object/client/index.ts | 1 - .../endpoints/resources/object/index.ts | 1 - .../params/client/getWithInlinePath.ts | 11 - .../resources/params/client/getWithPath.ts | 11 - .../resources/params/client/index.ts | 4 - .../params/client/modifyWithInlinePath.ts | 20 - .../resources/params/client/modifyWithPath.ts | 18 - .../endpoints/resources/params/index.ts | 1 - .../primitive/client/getAndReturnBase64.ts | 22 - .../primitive/client/getAndReturnBool.ts | 20 - .../primitive/client/getAndReturnDate.ts | 20 - .../primitive/client/getAndReturnDatetime.ts | 22 - .../primitive/client/getAndReturnDouble.ts | 22 - .../primitive/client/getAndReturnInt.ts | 18 - .../primitive/client/getAndReturnLong.ts | 20 - .../primitive/client/getAndReturnString.ts | 22 - .../primitive/client/getAndReturnUuid.ts | 20 - .../resources/primitive/client/index.ts | 9 - .../endpoints/resources/primitive/index.ts | 1 - .../endpoints/resources/put/index.ts | 1 - .../resources/put/types/ErrorCategory.ts | 14 - .../resources/put/types/ErrorCode.ts | 37 - .../endpoints/resources/put/types/Error_.ts | 26 - .../resources/put/types/PutResponse.ts | 19 - .../endpoints/resources/put/types/index.ts | 4 - .../endpoints/resources/urls/client/index.ts | 4 - .../resources/urls/client/noEndingSlash.ts | 11 - .../resources/urls/client/withEndingSlash.ts | 11 - .../resources/urls/client/withMixedCase.ts | 11 - .../resources/urls/client/withUnderscores.ts | 11 - .../endpoints/resources/urls/index.ts | 1 - .../resources/generalErrors/index.ts | 1 - .../types/BadObjectRequestInfo.ts | 18 - .../resources/generalErrors/types/index.ts | 1 - .../src/serialization/resources/index.ts | 9 - .../resources/inlinedRequests/client/index.ts | 1 - .../client/requests/PostWithObjectBody.ts | 23 - .../inlinedRequests/client/requests/index.ts | 1 - .../resources/inlinedRequests/index.ts | 1 - .../resources/noAuth/client/index.ts | 1 - .../resources/noAuth/client/postWithNoAuth.ts | 11 - .../serialization/resources/noAuth/index.ts | 1 - .../resources/noReqBody/client/index.ts | 1 - .../noReqBody/client/postWithNoRequestBody.ts | 11 - .../resources/noReqBody/index.ts | 1 - .../client/getWithCustomHeader.ts | 11 - .../resources/reqWithHeaders/client/index.ts | 1 - .../resources/reqWithHeaders/index.ts | 1 - .../serialization/resources/types/index.ts | 1 - .../resources/types/resources/docs/index.ts | 1 - .../resources/docs/types/ObjectWithDocs.ts | 18 - .../types/resources/docs/types/index.ts | 1 - .../resources/types/resources/enum/index.ts | 1 - .../resources/enum/types/WeatherReport.ts | 14 - .../types/resources/enum/types/index.ts | 1 - .../resources/types/resources/index.ts | 8 - .../resources/types/resources/object/index.ts | 1 - .../resources/object/types/DoubleOptional.ts | 19 - .../types/NestedObjectWithOptionalField.ts | 21 - .../types/NestedObjectWithRequiredField.ts | 21 - .../object/types/ObjectWithMapOfMap.ts | 21 - .../object/types/ObjectWithOptionalField.ts | 42 - .../object/types/ObjectWithRequiredField.ts | 18 - .../resources/object/types/OptionalAlias.ts | 14 - .../types/resources/object/types/index.ts | 7 - .../resources/types/resources/union/index.ts | 1 - .../types/resources/union/types/Animal.ts | 30 - .../types/resources/union/types/Cat.ts | 18 - .../types/resources/union/types/Dog.ts | 18 - .../types/resources/union/types/index.ts | 3 - .../serde-layer-zurg/src/version.ts | 1 - .../serde-layer-zurg/tests/custom.test.ts | 13 - .../tests/mock-server/MockServer.ts | 29 - .../tests/mock-server/MockServerPool.ts | 106 - .../tests/mock-server/mockEndpointBuilder.ts | 227 -- .../tests/mock-server/randomBaseUrl.ts | 4 - .../tests/mock-server/setup.ts | 10 - .../tests/mock-server/withFormUrlEncoded.ts | 80 - .../tests/mock-server/withHeaders.ts | 70 - .../tests/mock-server/withJson.ts | 158 - .../serde-layer-zurg/tests/setup.ts | 80 - .../serde-layer-zurg/tests/tsconfig.json | 11 - .../tests/unit/auth/BasicAuth.test.ts | 92 - .../tests/unit/auth/BearerToken.test.ts | 14 - .../tests/unit/base64.test.ts | 53 - .../tests/unit/fetcher/Fetcher.test.ts | 261 -- .../unit/fetcher/HttpResponsePromise.test.ts | 143 - .../tests/unit/fetcher/RawResponse.test.ts | 34 - .../unit/fetcher/createRequestUrl.test.ts | 163 - .../tests/unit/fetcher/getRequestBody.test.ts | 129 - .../unit/fetcher/getResponseBody.test.ts | 97 - .../tests/unit/fetcher/logging.test.ts | 517 --- .../tests/unit/fetcher/makeRequest.test.ts | 54 - .../tests/unit/fetcher/redacting.test.ts | 1115 ------- .../unit/fetcher/requestWithRetries.test.ts | 230 -- .../tests/unit/fetcher/signals.test.ts | 69 - .../tests/unit/fetcher/test-file.txt | 1 - .../tests/unit/logging/logger.test.ts | 454 --- .../tests/unit/schemas/bigint/bigint.test.ts | 46 - .../tests/unit/schemas/date/date.test.ts | 31 - .../tests/unit/schemas/enum/enum.test.ts | 30 - .../tests/unit/schemas/lazy/lazy.test.ts | 57 - .../unit/schemas/lazy/lazyObject.test.ts | 18 - .../tests/unit/schemas/lazy/recursive/a.ts | 7 - .../tests/unit/schemas/lazy/recursive/b.ts | 8 - .../tests/unit/schemas/list/list.test.ts | 41 - .../schemas/literals/stringLiteral.test.ts | 21 - .../object-like/withParsedProperties.test.ts | 57 - .../tests/unit/schemas/object/extend.test.ts | 89 - .../tests/unit/schemas/object/object.test.ts | 255 -- .../objectWithoutOptionalProperties.test.ts | 21 - .../unit/schemas/object/passthrough.test.ts | 87 - .../tests/unit/schemas/primitives/any.test.ts | 6 - .../unit/schemas/primitives/boolean.test.ts | 14 - .../unit/schemas/primitives/never.test.ts | 54 - .../unit/schemas/primitives/number.test.ts | 14 - .../unit/schemas/primitives/string.test.ts | 14 - .../unit/schemas/primitives/unknown.test.ts | 6 - .../tests/unit/schemas/record/record.test.ts | 34 - .../schema-utils/getSchemaUtils.test.ts | 83 - .../tests/unit/schemas/schema.test.ts | 78 - .../tests/unit/schemas/set/set.test.ts | 48 - .../tests/unit/schemas/skipValidation.test.ts | 44 - .../undiscriminatedUnion.test.ts | 44 - .../tests/unit/schemas/union/union.test.ts | 113 - .../tests/unit/schemas/utils/itSchema.ts | 78 - .../tests/unit/schemas/utils/itValidate.ts | 56 - .../tests/unit/url/join.test.ts | 284 -- .../tests/unit/url/qs.test.ts | 278 -- .../serde-layer-zurg/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 - .../tests/wire/endpoints/contentType.test.ts | 88 - .../tests/wire/endpoints/enum.test.ts | 24 - .../tests/wire/endpoints/httpMethods.test.ts | 212 -- .../tests/wire/endpoints/object.test.ts | 448 --- .../tests/wire/endpoints/params.test.ts | 120 - .../tests/wire/endpoints/primitive.test.ts | 168 - .../tests/wire/endpoints/put.test.ts | 39 - .../tests/wire/endpoints/union.test.ts | 32 - .../tests/wire/endpoints/urls.test.ts | 68 - .../tests/wire/inlinedRequests.test.ts | 150 - .../tests/wire/noAuth.test.ts | 48 - .../tests/wire/noReqBody.test.ts | 58 - .../tests/wire/reqWithHeaders.test.ts | 29 - .../serde-layer-zurg/tsconfig.base.json | 18 - .../serde-layer-zurg/tsconfig.cjs.json | 9 - .../serde-layer-zurg/tsconfig.esm.json | 10 - .../exhaustive/serde-layer-zurg/tsconfig.json | 3 - .../serde-layer-zurg/vitest.config.mts | 28 - 898 files changed, 56602 deletions(-) delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/.gitignore delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/README.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/biome.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/package.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/reference.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/snippet.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/README.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/biome.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/package.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/reference.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/README.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/package.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json delete mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json deleted file mode 100644 index 48f29b85d5d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/.fern/metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "cliVersion": "DUMMY", - "generatorName": "fernapi/fern-typescript-sdk", - "generatorVersion": "latest", - "generatorConfig": { - "serializationFormat": "none" - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml deleted file mode 100644 index 836106996595..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/.github/workflows/ci.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: ci - -on: [push] - -jobs: - compile: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Compile - run: pnpm build - - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Test - run: pnpm test - - publish: - needs: [ compile, test ] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build - run: pnpm build - - - name: Publish to npm - run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - publish() { # use latest npm to ensure OIDC support - npx -y npm@latest publish "$@" - } - if [[ ${GITHUB_REF} == *alpha* ]]; then - publish --access public --tag alpha - elif [[ ${GITHUB_REF} == *beta* ]]; then - publish --access public --tag beta - else - publish --access public - fi - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore deleted file mode 100644 index 72271e049c02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.DS_Store -/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md deleted file mode 100644 index fe5bc2f77e0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/CONTRIBUTING.md +++ /dev/null @@ -1,133 +0,0 @@ -# Contributing - -Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. - -## Getting Started - -### Prerequisites - -- Node.js 20 or higher -- pnpm package manager - -### Installation - -Install the project dependencies: - -```bash -pnpm install -``` - -### Building - -Build the project: - -```bash -pnpm build -``` - -### Testing - -Run the test suite: - -```bash -pnpm test -``` - -Run specific test types: -- `pnpm test:unit` - Run unit tests -- `pnpm test:wire` - Run wire/integration tests - -### Linting and Formatting - -Check code style: - -```bash -pnpm run lint -pnpm run format:check -``` - -Fix code style issues: - -```bash -pnpm run lint:fix -pnpm run format:fix -``` - -Or use the combined check command: - -```bash -pnpm run check:fix -``` - -## About Generated Code - -**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. - -### Generated Files - -The following directories contain generated code: -- `src/api/` - API client classes and types -- `src/serialization/` - Serialization/deserialization logic -- Most TypeScript files in `src/` - -### How to Customize - -If you need to customize the SDK, you have two options: - -#### Option 1: Use `.fernignore` - -For custom code that should persist across SDK regenerations: - -1. Create a `.fernignore` file in the project root -2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) -3. Add your custom code to those files - -Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. - -For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). - -#### Option 2: Contribute to the Generator - -If you want to change how code is generated for all users of this SDK: - -1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) -2. Generator code is located at `generators/typescript/sdk/` -3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) -4. Submit a pull request with your changes to the generator - -This approach is best for: -- Bug fixes in generated code -- New features that would benefit all users -- Improvements to code generation patterns - -## Making Changes - -### Workflow - -1. Create a new branch for your changes -2. Make your modifications -3. Run tests to ensure nothing breaks: `pnpm test` -4. Run linting and formatting: `pnpm run check:fix` -5. Build the project: `pnpm build` -6. Commit your changes with a clear commit message -7. Push your branch and create a pull request - -### Commit Messages - -Write clear, descriptive commit messages that explain what changed and why. - -### Code Style - -This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. - -## Questions or Issues? - -If you have questions or run into issues: - -1. Check the [Fern documentation](https://buildwithfern.com) -2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) -3. Open a new issue if your question hasn't been addressed - -## License - -By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/README.md b/seed/ts-sdk/exhaustive/serde-layer-none/README.md deleted file mode 100644 index 140b1fb505f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/README.md +++ /dev/null @@ -1,241 +0,0 @@ -# Seed TypeScript Library - -[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) -[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) - -The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. - -## Installation - -```sh -npm i -s @fern/exhaustive -``` - -## Reference - -A full reference for this library is available [here](./reference.md). - -## Usage - -Instantiate and use the client with the following: - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); -``` - -## Request And Response Types - -The SDK exports all request and response types as TypeScript interfaces. Simply import them with the -following namespace: - -```typescript -import { SeedExhaustive } from "@fern/exhaustive"; - -const request: SeedExhaustive.GetWithInlinePath = { - ... -}; -``` - -## Exception Handling - -When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error -will be thrown. - -```typescript -import { SeedExhaustiveError } from "@fern/exhaustive"; - -try { - await client.endpoints.container.getAndReturnListOfPrimitives(...); -} catch (err) { - if (err instanceof SeedExhaustiveError) { - console.log(err.statusCode); - console.log(err.message); - console.log(err.body); - console.log(err.rawResponse); - } -} -``` - -## Advanced - -### Additional Headers - -If you would like to send additional headers as part of the request, use the `headers` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - headers: { - 'X-Custom-Header': 'custom value' - } -}); -``` - -### Additional Query String Parameters - -If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - queryParams: { - 'customQueryParamKey': 'custom query param value' - } -}); -``` - -### Retries - -The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long -as the request is deemed retryable and the number of retry attempts has not grown larger than the configured -retry limit (default: 2). - -A request is deemed retryable when any of the following HTTP status codes is returned: - -- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) -- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) -- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) - -Use the `maxRetries` request option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - maxRetries: 0 // override maxRetries at the request level -}); -``` - -### Timeouts - -The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - timeoutInSeconds: 30 // override timeout to 30s -}); -``` - -### Aborting Requests - -The SDK allows users to abort requests at any point by passing in an abort signal. - -```typescript -const controller = new AbortController(); -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - abortSignal: controller.signal -}); -controller.abort(); // aborts the request -``` - -### Access Raw Response Data - -The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. -The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. - -```typescript -const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); - -console.log(data); -console.log(rawResponse.headers['X-My-Header']); -``` - -### Logging - -The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. - -```typescript -import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - logging: { - level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info - logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger - silent: false, // defaults to true, set to false to enable logging - } -}); -``` -The `logging` object can have the following properties: -- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. -- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. -- `silent`: Whether to silence the logger. Defaults to `true`. - -The `level` property can be one of the following values: -- `logging.LogLevel.Debug` -- `logging.LogLevel.Info` -- `logging.LogLevel.Warn` -- `logging.LogLevel.Error` - -To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. - -

-Custom logger examples - -Here's an example using the popular `winston` logging library. -```ts -import winston from 'winston'; - -const winstonLogger = winston.createLogger({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => winstonLogger.debug(msg, ...args), - info: (msg, ...args) => winstonLogger.info(msg, ...args), - warn: (msg, ...args) => winstonLogger.warn(msg, ...args), - error: (msg, ...args) => winstonLogger.error(msg, ...args), -}; -``` - -Here's an example using the popular `pino` logging library. - -```ts -import pino from 'pino'; - -const pinoLogger = pino({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => pinoLogger.debug(args, msg), - info: (msg, ...args) => pinoLogger.info(args, msg), - warn: (msg, ...args) => pinoLogger.warn(args, msg), - error: (msg, ...args) => pinoLogger.error(args, msg), -}; -``` -
- - -### Runtime Compatibility - - -The SDK works in the following runtimes: - - - -- Node.js 18+ -- Vercel -- Cloudflare Workers -- Deno v1.25+ -- Bun 1.0+ -- React Native - -### Customizing Fetch Client - -The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an -unsupported environment, this provides a way for you to break glass and ensure the SDK works. - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - fetcher: // provide your implementation here -}); -``` - -## Contributing - -While we value open-source contributions to this SDK, this library is generated programmatically. -Additions made directly to this library would have to be moved over to our generation code, -otherwise they would be overwritten upon the next generated release. Feel free to open a PR as -a proof of concept, but know that we will not be able to merge it as-is. We suggest opening -an issue first to discuss with us! - -On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/biome.json b/seed/ts-sdk/exhaustive/serde-layer-none/biome.json deleted file mode 100644 index a777468e4ae2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/biome.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", - "root": true, - "vcs": { - "enabled": false - }, - "files": { - "ignoreUnknown": true, - "includes": [ - "**", - "!!dist", - "!!**/dist", - "!!lib", - "!!**/lib", - "!!_tmp_*", - "!!**/_tmp_*", - "!!*.tmp", - "!!**/*.tmp", - "!!.tmp/", - "!!**/.tmp/", - "!!*.log", - "!!**/*.log", - "!!**/.DS_Store", - "!!**/Thumbs.db" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 4, - "lineWidth": 120 - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - }, - "linter": { - "rules": { - "style": { - "useNodejsImportProtocol": "off" - }, - "suspicious": { - "noAssignInExpressions": "warn", - "noUselessEscapeInString": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noThenProperty": "warn", - "useIterableCallbackReturn": "warn", - "noShadowRestrictedNames": "warn", - "noTsIgnore": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noConfusingVoidType": { - "level": "warn", - "fix": "none", - "options": {} - } - } - } - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/package.json b/seed/ts-sdk/exhaustive/serde-layer-none/package.json deleted file mode 100644 index d78462fbefd6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "@fern/exhaustive", - "version": "0.0.1", - "private": false, - "repository": "github:exhaustive/fern", - "type": "commonjs", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.mjs", - "types": "./dist/cjs/index.d.ts", - "exports": { - ".": { - "types": "./dist/cjs/index.d.ts", - "import": { - "types": "./dist/esm/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - }, - "default": "./dist/cjs/index.js" - }, - "./package.json": "./package.json" - }, - "files": [ - "dist", - "reference.md", - "README.md", - "LICENSE" - ], - "scripts": { - "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "build": "pnpm build:cjs && pnpm build:esm", - "build:cjs": "tsc --project ./tsconfig.cjs.json", - "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", - "test": "vitest", - "test:unit": "vitest --project unit", - "test:wire": "vitest --project wire" - }, - "dependencies": {}, - "devDependencies": { - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", - "vitest": "^3.2.4", - "msw": "2.11.2", - "@types/node": "^18.19.70", - "typescript": "~5.7.2", - "@biomejs/biome": "2.3.1" - }, - "browser": { - "fs": false, - "os": false, - "path": false, - "stream": false - }, - "packageManager": "pnpm@10.20.0", - "engines": { - "node": ">=18.0.0" - }, - "sideEffects": false -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml deleted file mode 100644 index 6e4c395107df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/pnpm-workspace.yaml +++ /dev/null @@ -1 +0,0 @@ -packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/reference.md b/seed/ts-sdk/exhaustive/serde-layer-none/reference.md deleted file mode 100644 index c7d4e874e8a2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/reference.md +++ /dev/null @@ -1,2761 +0,0 @@ -# Reference -## Endpoints Container -
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfObjects([{ - string: "string" - }, { - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfObjects([{ - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapPrimToPrim({ - "string": "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapOfPrimToObject({ - "string": { - string: "string" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnOptional({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints ContentType -
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Enum -
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.enum.getAndReturnEnum("SUNNY"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.WeatherReport` - -
-
- -
-
- -**requestOptions:** `EnumClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints HttpMethods -
client.endpoints.httpMethods.testGet(id) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testGet("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPost({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPut("id", { - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testDelete(id) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testDelete("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Object -
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - "map": { - "map": "map" - } - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithMapOfMap` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**string:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } - }, { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Params -
client.endpoints.params.getWithPath(param) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPath("param"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePath({ - param: "param" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with multiple of same query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPathAndQuery("param", { - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithPath(param, { ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithPath("param", "string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Primitive -
client.endpoints.primitive.getAndReturnString({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnString("string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnInt(1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnLong(1000000); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDouble(1.1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBool(true); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `boolean` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Put -
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.put.add({ - id: "id" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.PutRequest` - -
-
- -
-
- -**requestOptions:** `PutClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Union -
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.Animal` - -
-
- -
-
- -**requestOptions:** `UnionClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Urls -
client.endpoints.urls.withMixedCase() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withMixedCase(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.noEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.noEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withUnderscores() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withUnderscores(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## InlinedRequests -
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 📝 Description - -
-
- -
-
- -POST with custom object in request body, response is an object -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.PostWithObjectBody` - -
-
- -
-
- -**requestOptions:** `InlinedRequestsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoAuth -
client.noAuth.postWithNoAuth({ ...params }) -> boolean -
-
- -#### 📝 Description - -
-
- -
-
- -POST request with no auth -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noAuth.postWithNoAuth({ - "key": "value" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `unknown` - -
-
- -
-
- -**requestOptions:** `NoAuthClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoReqBody -
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.getWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.noReqBody.postWithNoRequestBody() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.postWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## ReqWithHeaders -
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.reqWithHeaders.getWithCustomHeader({ - "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ReqWithHeaders` - -
-
- -
-
- -**requestOptions:** `ReqWithHeadersClient.RequestOptions` - -
-
-
-
- - -
-
-
diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js deleted file mode 100644 index dc1df1cbbacb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/scripts/rename-to-esm-files.js +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs").promises; -const path = require("path"); - -const extensionMap = { - ".js": ".mjs", - ".d.ts": ".d.mts", -}; -const oldExtensions = Object.keys(extensionMap); - -async function findFiles(rootPath) { - const files = []; - - async function scan(directory) { - const entries = await fs.readdir(directory, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(directory, entry.name); - - if (entry.isDirectory()) { - if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { - await scan(fullPath); - } - } else if (entry.isFile()) { - if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { - files.push(fullPath); - } - } - } - } - - await scan(rootPath); - return files; -} - -async function updateFiles(files) { - const updatedFiles = []; - for (const file of files) { - const updated = await updateFileContents(file); - updatedFiles.push(updated); - } - - console.log(`Updated imports in ${updatedFiles.length} files.`); -} - -async function updateFileContents(file) { - const content = await fs.readFile(file, "utf8"); - - let newContent = content; - // Update each extension type defined in the map - for (const [oldExt, newExt] of Object.entries(extensionMap)) { - // Handle static imports/exports - const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); - newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); - - // Handle dynamic imports (yield import, await import, regular import()) - const dynamicRegex = new RegExp( - `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, - "g", - ); - newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); - } - - if (content !== newContent) { - await fs.writeFile(file, newContent, "utf8"); - return true; - } - return false; -} - -async function renameFiles(files) { - let counter = 0; - for (const file of files) { - const ext = oldExtensions.find((ext) => file.endsWith(ext)); - const newExt = extensionMap[ext]; - - if (newExt) { - const newPath = file.slice(0, -ext.length) + newExt; - await fs.rename(file, newPath); - counter++; - } - } - - console.log(`Renamed ${counter} files.`); -} - -async function main() { - try { - const targetDir = process.argv[2]; - if (!targetDir) { - console.error("Please provide a target directory"); - process.exit(1); - } - - const targetPath = path.resolve(targetDir); - const targetStats = await fs.stat(targetPath); - - if (!targetStats.isDirectory()) { - console.error("The provided path is not a directory"); - process.exit(1); - } - - console.log(`Scanning directory: ${targetDir}`); - - const files = await findFiles(targetDir); - - if (files.length === 0) { - console.log("No matching files found."); - process.exit(0); - } - - console.log(`Found ${files.length} files.`); - await updateFiles(files); - await renameFiles(files); - console.log("\nDone!"); - } catch (error) { - console.error("An error occurred:", error.message); - process.exit(1); - } -} - -main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json deleted file mode 100644 index 33399dc5484e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/snippet.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "endpoints": [ - { - "id": { - "path": "/container/list-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" - } - }, - { - "id": { - "path": "/container/list-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/set-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives([\"string\"]);\n" - } - }, - { - "id": { - "path": "/container/set-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-prim", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-object", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" - } - }, - { - "id": { - "path": "/container/opt-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/foo/bar", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/foo/baz", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/enum", - "method": "POST", - "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "GET", - "identifier_override": "endpoint_endpoints/http-methods.testGet" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" - } - }, - { - "id": { - "path": "/http-methods", - "method": "POST", - "identifier_override": "endpoint_endpoints/http-methods.testPost" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/http-methods.testPut" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PATCH", - "identifier_override": "endpoint_endpoints/http-methods.testPatch" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "DELETE", - "identifier_override": "endpoint_endpoints/http-methods.testDelete" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-required-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-map-of-map", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field/{string}", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field-list", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/primitive/string", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" - } - }, - { - "id": { - "path": "/primitive/integer", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" - } - }, - { - "id": { - "path": "/primitive/long", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" - } - }, - { - "id": { - "path": "/primitive/double", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" - } - }, - { - "id": { - "path": "/primitive/boolean", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" - } - }, - { - "id": { - "path": "/primitive/datetime", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(\"2024-01-15T09:30:00Z\");\n" - } - }, - { - "id": { - "path": "/primitive/date", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" - } - }, - { - "id": { - "path": "/primitive/uuid", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" - } - }, - { - "id": { - "path": "/primitive/base64", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" - } - }, - { - "id": { - "path": "/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/put.add" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" - } - }, - { - "id": { - "path": "/union", - "method": "POST", - "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" - } - }, - { - "id": { - "path": "/urls/MixedCase", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withMixedCase" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" - } - }, - { - "id": { - "path": "/urls/no-ending-slash", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.noEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with-ending-slash/", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with_underscores", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withUnderscores" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" - } - }, - { - "id": { - "path": "/req-bodies/object", - "method": "POST", - "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n NestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: \"2024-01-15T09:30:00Z\",\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: [\"set\"],\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/no-auth", - "method": "POST", - "identifier_override": "endpoint_no-auth.postWithNoAuth" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "GET", - "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "POST", - "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/test-headers/custom-header", - "method": "POST", - "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n \"X-TEST-SERVICE-HEADER\": \"X-TEST-SERVICE-HEADER\",\n \"X-TEST-ENDPOINT-HEADER\": \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" - } - } - ], - "types": {} -} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts deleted file mode 100644 index f28de2b4c43c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/BaseClient.ts +++ /dev/null @@ -1,82 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; -import { mergeHeaders } from "./core/headers.js"; -import * as core from "./core/index.js"; - -export interface BaseClientOptions { - environment: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token?: core.Supplier; - /** Additional headers to include in requests. */ - headers?: Record | null | undefined>; - /** The default maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The default number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ - fetch?: typeof fetch; - /** Configure logging for the client. */ - logging?: core.logging.LogConfig | core.logging.Logger; -} - -export interface BaseRequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Additional query string parameters to include in the request. */ - queryParams?: Record; - /** Additional headers to include in the request. */ - headers?: Record | null | undefined>; -} - -export type NormalizedClientOptions = T & { - logging: core.logging.Logger; - authProvider?: core.AuthProvider; -}; - -export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { - authProvider: core.AuthProvider; -}; - -export function normalizeClientOptions(options: T): NormalizedClientOptions { - const headers = mergeHeaders( - { - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "@fern/exhaustive", - "X-Fern-SDK-Version": "0.0.1", - "User-Agent": "@fern/exhaustive/0.0.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - }, - options?.headers, - ); - - return { - ...options, - logging: core.logging.createLogger(options?.logging), - headers, - } as NormalizedClientOptions; -} - -export function normalizeClientOptionsWithAuth( - options: T, -): NormalizedClientOptionsWithAuth { - const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; - const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); - normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); - return normalized; -} - -function withNoOpAuthProvider( - options: NormalizedClientOptions, -): NormalizedClientOptionsWithAuth { - return { - ...options, - authProvider: new core.NoOpAuthProvider(), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts deleted file mode 100644 index d5ca904d9544..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/Client.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; -import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; -import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; -import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; -import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; -import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; - -export declare namespace SeedExhaustiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class SeedExhaustiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _endpoints: EndpointsClient | undefined; - protected _inlinedRequests: InlinedRequestsClient | undefined; - protected _noAuth: NoAuthClient | undefined; - protected _noReqBody: NoReqBodyClient | undefined; - protected _reqWithHeaders: ReqWithHeadersClient | undefined; - - constructor(options: SeedExhaustiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get endpoints(): EndpointsClient { - return (this._endpoints ??= new EndpointsClient(this._options)); - } - - public get inlinedRequests(): InlinedRequestsClient { - return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); - } - - public get noAuth(): NoAuthClient { - return (this._noAuth ??= new NoAuthClient(this._options)); - } - - public get noReqBody(): NoReqBodyClient { - return (this._noReqBody ??= new NoReqBodyClient(this._options)); - } - - public get reqWithHeaders(): ReqWithHeadersClient { - return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts deleted file mode 100644 index b124def3d861..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/Client.ts +++ /dev/null @@ -1,76 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { ContainerClient } from "../resources/container/client/Client.js"; -import { ContentTypeClient } from "../resources/contentType/client/Client.js"; -import { EnumClient } from "../resources/enum/client/Client.js"; -import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; -import { ObjectClient } from "../resources/object/client/Client.js"; -import { ParamsClient } from "../resources/params/client/Client.js"; -import { PrimitiveClient } from "../resources/primitive/client/Client.js"; -import { PutClient } from "../resources/put/client/Client.js"; -import { UnionClient } from "../resources/union/client/Client.js"; -import { UrlsClient } from "../resources/urls/client/Client.js"; - -export declare namespace EndpointsClient { - export interface Options extends BaseClientOptions {} -} - -export class EndpointsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _container: ContainerClient | undefined; - protected _contentType: ContentTypeClient | undefined; - protected _enum: EnumClient | undefined; - protected _httpMethods: HttpMethodsClient | undefined; - protected _object: ObjectClient | undefined; - protected _params: ParamsClient | undefined; - protected _primitive: PrimitiveClient | undefined; - protected _put: PutClient | undefined; - protected _union: UnionClient | undefined; - protected _urls: UrlsClient | undefined; - - constructor(options: EndpointsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get container(): ContainerClient { - return (this._container ??= new ContainerClient(this._options)); - } - - public get contentType(): ContentTypeClient { - return (this._contentType ??= new ContentTypeClient(this._options)); - } - - public get enum(): EnumClient { - return (this._enum ??= new EnumClient(this._options)); - } - - public get httpMethods(): HttpMethodsClient { - return (this._httpMethods ??= new HttpMethodsClient(this._options)); - } - - public get object(): ObjectClient { - return (this._object ??= new ObjectClient(this._options)); - } - - public get params(): ParamsClient { - return (this._params ??= new ParamsClient(this._options)); - } - - public get primitive(): PrimitiveClient { - return (this._primitive ??= new PrimitiveClient(this._options)); - } - - public get put(): PutClient { - return (this._put ??= new PutClient(this._options)); - } - - public get union(): UnionClient { - return (this._union ??= new UnionClient(this._options)); - } - - public get urls(): UrlsClient { - return (this._urls ??= new UrlsClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts deleted file mode 100644 index 9eb1192dcc32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts deleted file mode 100644 index dd50598a34d7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/Client.ts +++ /dev/null @@ -1,458 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContainerClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContainerClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContainerClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) - */ - public getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string[], rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/list-of-primitives", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfObjects([{ - * string: "string" - * }, { - * string: "string" - * }]) - */ - public getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); - } - - private async __getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]) - */ - public getAndReturnSetOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnSetOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string[], rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfObjects([{ - * string: "string" - * }]) - */ - public getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); - } - - private async __getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField[], - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapPrimToPrim({ - * "string": "string" - * }) - */ - public getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); - } - - private async __getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-prim", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as Record, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapOfPrimToObject({ - * "string": { - * string: "string" - * } - * }) - */ - public getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); - } - - private async __getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as Record, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/map-prim-to-object", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnOptional({ - * string: "string" - * }) - */ - public getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); - } - - private async __getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/opt-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request != null ? request : undefined, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField | undefined, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts deleted file mode 100644 index 0dcd19c50614..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/Client.ts +++ /dev/null @@ -1,171 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContentTypeClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContentTypeClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContentTypeClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); - } - - private async __postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/bar", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__postJsonPatchContentWithCharsetType(request, requestOptions), - ); - } - - private async __postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/baz", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json; charset=utf-8", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/contentType/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts deleted file mode 100644 index f15447a67ae8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/Client.ts +++ /dev/null @@ -1,80 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace EnumClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class EnumClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: EnumClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.WeatherReport} request - * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.enum.getAndReturnEnum("SUNNY") - */ - public getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); - } - - private async __getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/enum", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as SeedExhaustive.types.WeatherReport, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts deleted file mode 100644 index 9383ef15a189..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/Client.ts +++ /dev/null @@ -1,334 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace HttpMethodsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class HttpMethodsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: HttpMethodsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testGet("id") - */ - public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); - } - - private async __testGet( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPost({ - * string: "string" - * }) - */ - public testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); - } - - private async __testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/http-methods", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPut("id", { - * string: "string" - * }) - */ - public testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); - } - - private async __testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPatch("id", { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); - } - - private async __testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PATCH", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testDelete("id") - */ - public testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); - } - - private async __testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "DELETE", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as boolean, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts deleted file mode 100644 index 6046843b5e42..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * as container from "./container/index.js"; -export * as contentType from "./contentType/index.js"; -export * as enum_ from "./enum/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * from "./params/client/requests/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * from "./put/client/requests/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as union from "./union/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts deleted file mode 100644 index 3a67887dbd74..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/Client.ts +++ /dev/null @@ -1,522 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ObjectClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ObjectClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ObjectClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithOptionalField({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); - } - - private async __getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-optional-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithRequiredField({ - * string: "string" - * }) - */ - public getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); - } - - private async __getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-required-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithRequiredField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-required-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithMapOfMap} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithMapOfMap({ - * map: { - * "map": { - * "map": "map" - * } - * } - * }) - */ - public getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); - } - - private async __getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-map-of-map", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithMapOfMap, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-map-of-map", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithOptionalField({ - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithOptionalField(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.NestedObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-optional-field", - ); - } - - /** - * @param {string} string - * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field/{string}", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }, { - * string: "string", - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }]) - */ - public getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-required-field-list", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.NestedObjectWithRequiredField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field-list", - ); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts deleted file mode 100644 index 890bfd8293e6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/Client.ts +++ /dev/null @@ -1,522 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ParamsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ParamsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ParamsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * GET with path param - * - * @param {string} param - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPath("param") - */ - public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); - } - - private async __getWithPath( - param: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with path param - * - * @param {SeedExhaustive.endpoints.GetWithInlinePath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePath({ - * param: "param" - * }) - */ - public getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); - } - - private async __getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with query param - * - * @param {SeedExhaustive.endpoints.GetWithQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); - } - - private async __getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - _queryParams.number = number_.toString(); - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with multiple of same query param - * - * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithAllowMultipleQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); - } - - private async __getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - if (Array.isArray(query)) { - _queryParams.query = query.map((item) => item); - } else { - _queryParams.query = query; - } - - if (Array.isArray(number_)) { - _queryParams.number = number_.map((item) => item.toString()); - } else { - _queryParams.number = number_.toString(); - } - - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with path and query params - * - * @param {string} param - * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPathAndQuery("param", { - * query: "query" - * }) - */ - public getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); - } - - private async __getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * GET with path and query params - * - * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePathAndQuery({ - * param: "param", - * query: "query" - * }) - */ - public getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); - } - - private async __getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * PUT to update with path param - * - * @param {string} param - * @param {string} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithPath("param", "string") - */ - public modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); - } - - private async __modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } - - /** - * PUT to update with path param - * - * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithInlinePath({ - * param: "param", - * body: "string" - * }) - */ - public modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); - } - - private async __modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: _body, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts deleted file mode 100644 index 473165eb1638..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param" - * } - */ -export interface GetWithInlinePath { - param: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts deleted file mode 100644 index 9c674a852dce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * query: "query" - * } - */ -export interface GetWithInlinePathAndQuery { - param: string; - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts deleted file mode 100644 index baca4fafbe62..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithMultipleQuery { - query: string | string[]; - number: number | number[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts deleted file mode 100644 index c3f0018a7874..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query" - * } - */ -export interface GetWithPathAndQuery { - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts deleted file mode 100644 index 7ad48dee4508..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithQuery { - query: string; - number: number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts deleted file mode 100644 index f3f91a06e3f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * body: "string" - * } - */ -export interface ModifyResourceAtInlinedPath { - param: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts deleted file mode 100644 index b059d3702a32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/client/requests/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { GetWithInlinePath } from "./GetWithInlinePath.js"; -export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; -export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; -export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; -export type { GetWithQuery } from "./GetWithQuery.js"; -export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts deleted file mode 100644 index 98244a13252b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/Client.ts +++ /dev/null @@ -1,535 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; - -export declare namespace PrimitiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PrimitiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PrimitiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnString("string") - */ - public getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); - } - - private async __getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/string", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnInt(1) - */ - public getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); - } - - private async __getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/integer", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as number, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnLong(1000000) - */ - public getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); - } - - private async __getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/long", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as number, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDouble(1.1) - */ - public getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); - } - - private async __getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/double", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as number, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); - } - - /** - * @param {boolean} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBool(true) - */ - public getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); - } - - private async __getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/boolean", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as boolean, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z") - */ - public getAndReturnDatetime( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); - } - - private async __getAndReturnDatetime( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/datetime", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDate("2023-01-15") - */ - public getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); - } - - private async __getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/date", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") - */ - public getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); - } - - private async __getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/uuid", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") - */ - public getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); - } - - private async __getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/base64", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts deleted file mode 100644 index 5c4e4edf4e39..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/Client.ts +++ /dev/null @@ -1,80 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace PutClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PutClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PutClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.endpoints.PutRequest} request - * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.put.add({ - * id: "id" - * }) - */ - public add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); - } - - private async __add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): Promise> { - const { id } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as SeedExhaustive.endpoints.PutResponse, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts deleted file mode 100644 index 2beba9f087cc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * id: "id" - * } - */ -export interface PutRequest { - id: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts deleted file mode 100644 index dba0eda4bbee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts deleted file mode 100644 index d9adb1af9a93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index a197fec87887..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCategory = { - ApiError: "API_ERROR", - AuthenticationError: "AUTHENTICATION_ERROR", - InvalidRequestError: "INVALID_REQUEST_ERROR", -} as const; -export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 3943226222d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCode = { - InternalServerError: "INTERNAL_SERVER_ERROR", - Unauthorized: "UNAUTHORIZED", - Forbidden: "FORBIDDEN", - BadRequest: "BAD_REQUEST", - Conflict: "CONFLICT", - Gone: "GONE", - UnprocessableEntity: "UNPROCESSABLE_ENTITY", - NotImplemented: "NOT_IMPLEMENTED", - BadGateway: "BAD_GATEWAY", - ServiceUnavailable: "SERVICE_UNAVAILABLE", - Unknown: "Unknown", -} as const; -export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 9cf9f495a09a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface Error_ { - category: SeedExhaustive.endpoints.ErrorCategory; - code: SeedExhaustive.endpoints.ErrorCode; - detail?: string; - field?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 628b46ba7298..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface PutResponse { - errors?: SeedExhaustive.endpoints.Error_[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts deleted file mode 100644 index fe75d063f585..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/Client.ts +++ /dev/null @@ -1,84 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace UnionClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UnionClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UnionClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.Animal} request - * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.union.getAndReturnUnion({ - * animal: "dog", - * name: "name", - * likesToWoof: true - * }) - */ - public getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); - } - - private async __getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/union", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as SeedExhaustive.types.Animal, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts deleted file mode 100644 index 955bb036344f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/Client.ts +++ /dev/null @@ -1,210 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; - -export declare namespace UrlsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UrlsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UrlsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withMixedCase() - */ - public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); - } - - private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/MixedCase", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.noEndingSlash() - */ - public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); - } - - private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/no-ending-slash", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withEndingSlash() - */ - public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); - } - - private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with-ending-slash/", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withUnderscores() - */ - public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); - } - - private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with_underscores", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts deleted file mode 100644 index 6c0020d2b75a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/BadRequestBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../core/index.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export class BadRequestBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { - super({ - message: "BadRequestBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts deleted file mode 100644 index 61778bda5417..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index 6ad426742488..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface BadObjectRequestInfo { - message: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts deleted file mode 100644 index 3ca611c9fb54..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * from "./generalErrors/errors/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * from "./reqWithHeaders/client/requests/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts deleted file mode 100644 index b2a084be5dbd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/Client.ts +++ /dev/null @@ -1,110 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace InlinedRequestsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class InlinedRequestsClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: InlinedRequestsClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST with custom object in request body, response is an object - * - * @param {SeedExhaustive.PostWithObjectBody} request - * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.inlinedRequests.postWithObjectBodyandResponse({ - * string: "string", - * integer: 1, - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); - } - - private async __postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/req-bodies/object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - _response.error.body as SeedExhaustive.BadObjectRequestInfo, - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index b20679ee1c90..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../index.js"; - -/** - * @example - * { - * string: "string", - * integer: 1, - * NestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: "2024-01-15T09:30:00Z", - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: ["set"], - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * } - */ -export interface PostWithObjectBody { - string: string; - integer: number; - NestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index 104f84256770..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts deleted file mode 100644 index cefce5ee90bd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/Client.ts +++ /dev/null @@ -1,89 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoAuthClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoAuthClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: NoAuthClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST request with no auth - * - * @param {unknown} request - * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.noAuth.postWithNoAuth({ - * "key": "value" - * }) - */ - public postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); - } - - private async __postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-auth", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as boolean, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - _response.error.body as SeedExhaustive.BadObjectRequestInfo, - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts deleted file mode 100644 index dbf262403321..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/Client.ts +++ /dev/null @@ -1,126 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoReqBodyClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoReqBodyClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: NoReqBodyClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.getWithNoRequestBody() - */ - public getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); - } - - private async __getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: _response.body as SeedExhaustive.types.ObjectWithOptionalField, - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.postWithNoRequestBody() - */ - public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); - } - - private async __postWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "POST", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: _response.body as string, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts deleted file mode 100644 index 29b39fb91fdd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace ReqWithHeadersClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ReqWithHeadersClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ReqWithHeadersClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.ReqWithHeaders} request - * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.reqWithHeaders.getWithCustomHeader({ - * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - * body: "string" - * }) - */ - public getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); - } - - private async __getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): Promise> { - const { - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - body: _body, - } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - mergeOnlyDefinedHeaders({ - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - }), - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/test-headers/custom-header", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: _body, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts deleted file mode 100644 index 4b2e6816729b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - * "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - * body: "string" - * } - */ -export interface ReqWithHeaders { - "X-TEST-SERVICE-HEADER": string; - "X-TEST-ENDPOINT-HEADER": string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts deleted file mode 100644 index 5419b56cd667..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index ed458c66ba3c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,66 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithDocs { - /** - * Characters that could lead to broken generated SDKs: - * - * Markdown Escapes: - * - \_: Escaped underscore (e.g., FOO\_BAR) - * - \*: Escaped asterisk - * - * JSDoc (JavaScript/TypeScript): - * - @: Used for JSDoc tags - * - {: }: Used for type definitions - * - <: >: HTML tags - * - *: Can interfere with comment blocks - * - /**: JSDoc comment start - * - ** /: JSDoc comment end - * - &: HTML entities - * - * XMLDoc (C#): - * - <: >: XML tags - * - &: ': ": <: >: XML special characters - * - {: }: Used for interpolated strings - * - ///: Comment marker - * - /**: Block comment start - * - ** /: Block comment end - * - * Javadoc (Java): - * - @: Used for Javadoc tags - * - <: >: HTML tags - * - &: HTML entities - * - *: Can interfere with comment blocks - * - /**: Javadoc comment start - * - ** /: Javadoc comment end - * - * Doxygen (C++): - * - \: Used for Doxygen commands - * - @: Alternative command prefix - * - <: >: XML/HTML tags - * - &: HTML entities - * - /**: C-style comment start - * - ** /: C-style comment end - * - * RDoc (Ruby): - * - :: Used in symbol notation - * - =: Section markers - * - #: Comment marker - * - =begin: Block comment start - * - =end: Block comment end - * - @: Instance variable prefix - * - $: Global variable prefix - * - %: String literal delimiter - * - #{: String interpolation start - * - }: String interpolation end - * - * PHPDoc (PHP): - * - @: Used for PHPDoc tags - * - {: }: Used for type definitions - * - $: Variable prefix - * - /**: PHPDoc comment start - * - ** /: PHPDoc comment end - * - *: Can interfere with comment blocks - * - &: HTML entities - */ - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts deleted file mode 100644 index ef1aee2d386e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithEnumBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithEnumBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts deleted file mode 100644 index 203651bfb712..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index 4023a0068946..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const WeatherReport = { - Sunny: "SUNNY", - Cloudy: "CLOUDY", - Raining: "RAINING", - Snowing: "SNOWING", -} as const; -export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts deleted file mode 100644 index c2a44b58ecd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * from "./enum/errors/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * from "./object/errors/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * from "./union/errors/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts deleted file mode 100644 index 2681788e4f04..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts deleted file mode 100644 index 203710315112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts deleted file mode 100644 index 230964f8467f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts deleted file mode 100644 index b8a86dc99dd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts deleted file mode 100644 index e38a83090455..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/errors/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./NestedObjectWithOptionalFieldError.js"; -export * from "./NestedObjectWithRequiredFieldError.js"; -export * from "./ObjectWithOptionalFieldError.js"; -export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index 4898ba728836..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface DoubleOptional { - optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index b7fddd5d2018..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithOptionalField { - string?: string; - NestedObject?: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index ae3312eae621..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithRequiredField { - string: string; - NestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index b35138a717bb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithMapOfMap { - map: Record>; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 47615d58f541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithOptionalField { - /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ - string?: string; - integer?: number; - long?: number; - double?: number; - bool?: boolean; - datetime?: string; - date?: string; - uuid?: string; - base64?: string; - list?: string[]; - set?: string[]; - map?: Record; - bigint?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index 032a84135c9e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithRequiredField { - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index 5dac5b761df8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts deleted file mode 100644 index c0e5b750495f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithUnionBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithUnionBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts deleted file mode 100644 index 940b191924ee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index f5336c6b33bc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; - -export namespace Animal { - export interface Dog extends SeedExhaustive.types.Dog { - animal: "dog"; - } - - export interface Cat extends SeedExhaustive.types.Cat { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index aa74d5b7dd01..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Cat { - name: string; - likesToMeow: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 24bc9aa321b1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Dog { - name: string; - likesToWoof: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/api/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts deleted file mode 100644 index b556b3f7bd94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/BearerAuthProvider.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../core/index.js"; -import * as errors from "../errors/index.js"; - -export namespace BearerAuthProvider { - export interface Options { - token?: core.Supplier; - } -} - -export class BearerAuthProvider implements core.AuthProvider { - private readonly token: core.Supplier; - - constructor(options: BearerAuthProvider.Options) { - this.token = options.token; - } - - public static canCreate(options: BearerAuthProvider.Options): boolean { - return options.token != null; - } - - public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { - const token = await core.Supplier.get(this.token); - if (token == null) { - throw new errors.SeedExhaustiveError({ - message: "Please specify a token by passing it in to the constructor", - }); - } - - return { - headers: { Authorization: `Bearer ${token}` }, - }; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts deleted file mode 100644 index 0ecb12b79bdb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts deleted file mode 100644 index 895a50ff30da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthProvider.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export interface AuthProvider { - getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts deleted file mode 100644 index f6218b42211e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/AuthRequest.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Request parameters for authentication requests. - */ -export interface AuthRequest { - /** - * The headers to be included in the request. - */ - headers: Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts deleted file mode 100644 index a64235910062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BasicAuth.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { base64Decode, base64Encode } from "../base64.js"; - -export interface BasicAuth { - username: string; - password: string; -} - -const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; - -export const BasicAuth = { - toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { - if (basicAuth == null) { - return undefined; - } - const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); - return `Basic ${token}`; - }, - fromAuthorizationHeader: (header: string): BasicAuth => { - const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); - const decoded = base64Decode(credentials); - const [username, ...passwordParts] = decoded.split(":"); - const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; - - if (username == null || password == null) { - throw new Error("Invalid basic auth"); - } - return { - username, - password, - }; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts deleted file mode 100644 index c44a06c38f06..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/BearerToken.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type BearerToken = string; - -const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; - -function toAuthorizationHeader(token: string | undefined): string | undefined { - if (token == null) { - return undefined; - } - return `Bearer ${token}`; -} - -export const BearerToken: { - toAuthorizationHeader: typeof toAuthorizationHeader; - fromAuthorizationHeader: (header: string) => BearerToken; -} = { - toAuthorizationHeader: toAuthorizationHeader, - fromAuthorizationHeader: (header: string): BearerToken => { - return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts deleted file mode 100644 index 5b7acfd2bd8b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/NoOpAuthProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { AuthProvider } from "./AuthProvider.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export class NoOpAuthProvider implements AuthProvider { - public getAuthRequest(): Promise { - return Promise.resolve({ headers: {} }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts deleted file mode 100644 index 2215b227709e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/auth/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { AuthProvider } from "./AuthProvider.js"; -export type { AuthRequest } from "./AuthRequest.js"; -export { BasicAuth } from "./BasicAuth.js"; -export { BearerToken } from "./BearerToken.js"; -export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts deleted file mode 100644 index 448a0db638a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/base64.ts +++ /dev/null @@ -1,27 +0,0 @@ -function base64ToBytes(base64: string): Uint8Array { - const binString = atob(base64); - return Uint8Array.from(binString, (m) => m.codePointAt(0)!); -} - -function bytesToBase64(bytes: Uint8Array): string { - const binString = String.fromCodePoint(...bytes); - return btoa(binString); -} - -export function base64Encode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "utf8").toString("base64"); - } - - const bytes = new TextEncoder().encode(input); - return bytesToBase64(bytes); -} - -export function base64Decode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "base64").toString("utf8"); - } - - const bytes = base64ToBytes(input); - return new TextDecoder().decode(bytes); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts deleted file mode 100644 index 69296d7100d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts deleted file mode 100644 index 97ab83c2b195..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/APIResponse.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RawResponse } from "./RawResponse.js"; - -/** - * The response of an API call. - * It is a successful response or a failed response. - */ -export type APIResponse = SuccessfulResponse | FailedResponse; - -export interface SuccessfulResponse { - ok: true; - body: T; - /** - * @deprecated Use `rawResponse` instead - */ - headers?: Record; - rawResponse: RawResponse; -} - -export interface FailedResponse { - ok: false; - error: T; - rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts deleted file mode 100644 index bca7f4c77981..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/BinaryResponse.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type BinaryResponse = { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - bodyUsed: Response["bodyUsed"]; - /** - * Returns a ReadableStream of the response body. - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) - */ - stream: () => Response["body"]; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer: () => ReturnType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob: () => ReturnType; - /** - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) - * Some versions of the Fetch API may not support this method. - */ - bytes?(): ReturnType; -}; - -export function getBinaryResponse(response: Response): BinaryResponse { - const binaryResponse: BinaryResponse = { - get bodyUsed() { - return response.bodyUsed; - }, - stream: () => response.body, - arrayBuffer: response.arrayBuffer.bind(response), - blob: response.blob.bind(response), - }; - if ("bytes" in response && typeof response.bytes === "function") { - binaryResponse.bytes = response.bytes.bind(response); - } - - return binaryResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts deleted file mode 100644 index 998d68f5c20c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointMetadata.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type SecuritySchemeKey = string; -/** - * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. - * All schemes in the collection must be satisfied for authentication to be successful. - */ -export type SecuritySchemeCollection = Record; -export type AuthScope = string; -export type EndpointMetadata = { - /** - * An array of security scheme collections. Each collection represents an alternative way to authenticate. - */ - security?: SecuritySchemeCollection[]; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts deleted file mode 100644 index 8079841c4062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/EndpointSupplier.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import type { Supplier } from "./Supplier.js"; - -type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; -export type EndpointSupplier = Supplier | EndpointSupplierFn; -export const EndpointSupplier = { - get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { - if (typeof supplier === "function") { - return (supplier as EndpointSupplierFn)(arg); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts deleted file mode 100644 index 58bb0e3ef7d9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Fetcher.ts +++ /dev/null @@ -1,391 +0,0 @@ -import { toJson } from "../json.js"; -import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; -import type { APIResponse } from "./APIResponse.js"; -import { createRequestUrl } from "./createRequestUrl.js"; -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import { EndpointSupplier } from "./EndpointSupplier.js"; -import { getErrorResponseBody } from "./getErrorResponseBody.js"; -import { getFetchFn } from "./getFetchFn.js"; -import { getRequestBody } from "./getRequestBody.js"; -import { getResponseBody } from "./getResponseBody.js"; -import { Headers } from "./Headers.js"; -import { makeRequest } from "./makeRequest.js"; -import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -import { requestWithRetries } from "./requestWithRetries.js"; - -export type FetchFunction = (args: Fetcher.Args) => Promise>; - -export declare namespace Fetcher { - export interface Args { - url: string; - method: string; - contentType?: string; - headers?: Record | null | undefined>; - queryParameters?: Record; - body?: unknown; - timeoutMs?: number; - maxRetries?: number; - withCredentials?: boolean; - abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes" | "form" | "other"; - responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; - duplex?: "half"; - endpointMetadata?: EndpointMetadata; - fetchFn?: typeof fetch; - logging?: LogConfig | Logger; - } - - export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; - - export interface FailedStatusCodeError { - reason: "status-code"; - statusCode: number; - body: unknown; - } - - export interface NonJsonError { - reason: "non-json"; - statusCode: number; - rawBody: string; - } - - export interface BodyIsNullError { - reason: "body-is-null"; - statusCode: number; - } - - export interface TimeoutError { - reason: "timeout"; - } - - export interface UnknownError { - reason: "unknown"; - errorMessage: string; - } -} - -const SENSITIVE_HEADERS = new Set([ - "authorization", - "www-authenticate", - "x-api-key", - "api-key", - "apikey", - "x-api-token", - "x-auth-token", - "auth-token", - "cookie", - "set-cookie", - "proxy-authorization", - "proxy-authenticate", - "x-csrf-token", - "x-xsrf-token", - "x-session-token", - "x-access-token", -]); - -function redactHeaders(headers: Headers | Record): Record { - const filtered: Record = {}; - for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { - if (SENSITIVE_HEADERS.has(key.toLowerCase())) { - filtered[key] = "[REDACTED]"; - } else { - filtered[key] = value; - } - } - return filtered; -} - -const SENSITIVE_QUERY_PARAMS = new Set([ - "api_key", - "api-key", - "apikey", - "token", - "access_token", - "access-token", - "auth_token", - "auth-token", - "password", - "passwd", - "secret", - "api_secret", - "api-secret", - "apisecret", - "key", - "session", - "session_id", - "session-id", -]); - -function redactQueryParameters(queryParameters?: Record): Record | undefined { - if (queryParameters == null) { - return queryParameters; - } - const redacted: Record = {}; - for (const [key, value] of Object.entries(queryParameters)) { - if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { - redacted[key] = "[REDACTED]"; - } else { - redacted[key] = value; - } - } - return redacted; -} - -function redactUrl(url: string): string { - const protocolIndex = url.indexOf("://"); - if (protocolIndex === -1) return url; - - const afterProtocol = protocolIndex + 3; - - // Find the first delimiter that marks the end of the authority section - const pathStart = url.indexOf("/", afterProtocol); - let queryStart = url.indexOf("?", afterProtocol); - let fragmentStart = url.indexOf("#", afterProtocol); - - const firstDelimiter = Math.min( - pathStart === -1 ? url.length : pathStart, - queryStart === -1 ? url.length : queryStart, - fragmentStart === -1 ? url.length : fragmentStart, - ); - - // Find the LAST @ before the delimiter (handles multiple @ in credentials) - let atIndex = -1; - for (let i = afterProtocol; i < firstDelimiter; i++) { - if (url[i] === "@") { - atIndex = i; - } - } - - if (atIndex !== -1) { - url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; - } - - // Recalculate queryStart since url might have changed - queryStart = url.indexOf("?"); - if (queryStart === -1) return url; - - fragmentStart = url.indexOf("#", queryStart); - const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; - const queryString = url.slice(queryStart + 1, queryEnd); - - if (queryString.length === 0) return url; - - // FAST PATH: Quick check if any sensitive keywords present - // Using indexOf is faster than regex for simple substring matching - const lower = queryString.toLowerCase(); - const hasSensitive = - lower.includes("token") || - lower.includes("key") || - lower.includes("password") || - lower.includes("passwd") || - lower.includes("secret") || - lower.includes("session") || - lower.includes("auth"); - - if (!hasSensitive) { - return url; - } - - // SLOW PATH: Parse and redact - const redactedParams: string[] = []; - const params = queryString.split("&"); - - for (const param of params) { - const equalIndex = param.indexOf("="); - if (equalIndex === -1) { - redactedParams.push(param); - continue; - } - - const key = param.slice(0, equalIndex); - let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); - - if (!shouldRedact && key.includes("%")) { - try { - const decodedKey = decodeURIComponent(key); - shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); - } catch {} - } - - redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); - } - - return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); -} - -async function getHeaders(args: Fetcher.Args): Promise { - const newHeaders: Headers = new Headers(); - - newHeaders.set( - "Accept", - args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", - ); - if (args.body !== undefined && args.contentType != null) { - newHeaders.set("Content-Type", args.contentType); - } - - if (args.headers == null) { - return newHeaders; - } - - for (const [key, value] of Object.entries(args.headers)) { - const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); - if (typeof result === "string") { - newHeaders.set(key, result); - continue; - } - if (result == null) { - continue; - } - newHeaders.set(key, `${result}`); - } - return newHeaders; -} - -export async function fetcherImpl(args: Fetcher.Args): Promise> { - const url = createRequestUrl(args.url, args.queryParameters); - const requestBody: BodyInit | undefined = await getRequestBody({ - body: args.body, - type: args.requestType ?? "other", - }); - const fetchFn = args.fetchFn ?? (await getFetchFn()); - const headers = await getHeaders(args); - const logger = createLogger(args.logging); - - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - headers: redactHeaders(headers), - queryParameters: redactQueryParameters(args.queryParameters), - hasBody: requestBody != null, - }; - logger.debug("Making HTTP request", metadata); - } - - try { - const response = await requestWithRetries( - async () => - makeRequest( - fetchFn, - url, - args.method, - headers, - requestBody, - args.timeoutMs, - args.abortSignal, - args.withCredentials, - args.duplex, - ), - args.maxRetries, - ); - - if (response.status >= 200 && response.status < 400) { - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(response.headers), - }; - logger.debug("HTTP request succeeded", metadata); - } - const body = await getResponseBody(response, args.responseType); - return { - ok: true, - body: body as R, - headers: response.headers, - rawResponse: toRawResponse(response), - }; - } else { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), - }; - logger.error("HTTP request failed with error status", metadata); - } - return { - ok: false, - error: { - reason: "status-code", - statusCode: response.status, - body: await getErrorResponseBody(response), - }, - rawResponse: toRawResponse(response), - }; - } - } catch (error) { - if (args.abortSignal?.aborted) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - }; - logger.error("HTTP request was aborted", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: "The user aborted a request", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error && error.name === "AbortError") { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - timeoutMs: args.timeoutMs, - }; - logger.error("HTTP request timed out", metadata); - } - return { - ok: false, - error: { - reason: "timeout", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - errorMessage: error.message, - }; - logger.error("HTTP request failed with error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: error.message, - }, - rawResponse: unknownRawResponse, - }; - } - - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - error: toJson(error), - }; - logger.error("HTTP request failed with unknown error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: toJson(error), - }, - rawResponse: unknownRawResponse, - }; - } -} - -export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts deleted file mode 100644 index af841aa24f55..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Headers.ts +++ /dev/null @@ -1,93 +0,0 @@ -let Headers: typeof globalThis.Headers; - -if (typeof globalThis.Headers !== "undefined") { - Headers = globalThis.Headers; -} else { - Headers = class Headers implements Headers { - private headers: Map; - - constructor(init?: HeadersInit) { - this.headers = new Map(); - - if (init) { - if (init instanceof Headers) { - init.forEach((value, key) => this.append(key, value)); - } else if (Array.isArray(init)) { - for (const [key, value] of init) { - if (typeof key === "string" && typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Each header entry must be a [string, string] tuple"); - } - } - } else { - for (const [key, value] of Object.entries(init)) { - if (typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Header values must be strings"); - } - } - } - } - } - - append(name: string, value: string): void { - const key = name.toLowerCase(); - const existing = this.headers.get(key) || []; - this.headers.set(key, [...existing, value]); - } - - delete(name: string): void { - const key = name.toLowerCase(); - this.headers.delete(key); - } - - get(name: string): string | null { - const key = name.toLowerCase(); - const values = this.headers.get(key); - return values ? values.join(", ") : null; - } - - has(name: string): boolean { - const key = name.toLowerCase(); - return this.headers.has(key); - } - - set(name: string, value: string): void { - const key = name.toLowerCase(); - this.headers.set(key, [value]); - } - - forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { - const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; - this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); - } - - getSetCookie(): string[] { - return this.headers.get("set-cookie") || []; - } - - *entries(): HeadersIterator<[string, string]> { - for (const [key, values] of this.headers.entries()) { - yield [key, values.join(", ")]; - } - } - - *keys(): HeadersIterator { - yield* this.headers.keys(); - } - - *values(): HeadersIterator { - for (const values of this.headers.values()) { - yield values.join(", "); - } - } - - [Symbol.iterator](): HeadersIterator<[string, string]> { - return this.entries(); - } - }; -} - -export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts deleted file mode 100644 index 692ca7d795f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/HttpResponsePromise.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { WithRawResponse } from "./RawResponse.js"; - -/** - * A promise that returns the parsed response and lets you retrieve the raw response too. - */ -export class HttpResponsePromise extends Promise { - private innerPromise: Promise>; - private unwrappedPromise: Promise | undefined; - - private constructor(promise: Promise>) { - // Initialize with a no-op to avoid premature parsing - super((resolve) => { - resolve(undefined as unknown as T); - }); - this.innerPromise = promise; - } - - /** - * Creates an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @param args - Arguments to pass to the function. - * @returns An `HttpResponsePromise` instance. - */ - public static fromFunction Promise>, T>( - fn: F, - ...args: Parameters - ): HttpResponsePromise { - return new HttpResponsePromise(fn(...args)); - } - - /** - * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @returns A function that returns an `HttpResponsePromise` instance. - */ - public static interceptFunction< - F extends (...args: never[]) => Promise>, - T = Awaited>["data"], - >(fn: F): (...args: Parameters) => HttpResponsePromise { - return (...args: Parameters): HttpResponsePromise => { - return HttpResponsePromise.fromPromise(fn(...args)); - }; - } - - /** - * Creates an `HttpResponsePromise` from an existing promise. - * - * @param promise - A promise resolving to a `WithRawResponse` object. - * @returns An `HttpResponsePromise` instance. - */ - public static fromPromise(promise: Promise>): HttpResponsePromise { - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from an executor function. - * - * @param executor - A function that takes resolve and reject callbacks to create a promise. - * @returns An `HttpResponsePromise` instance. - */ - public static fromExecutor( - executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, - ): HttpResponsePromise { - const promise = new Promise>(executor); - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from a resolved result. - * - * @param result - A `WithRawResponse` object to resolve immediately. - * @returns An `HttpResponsePromise` instance. - */ - public static fromResult(result: WithRawResponse): HttpResponsePromise { - const promise = Promise.resolve(result); - return new HttpResponsePromise(promise); - } - - private unwrap(): Promise { - if (!this.unwrappedPromise) { - this.unwrappedPromise = this.innerPromise.then(({ data }) => data); - } - return this.unwrappedPromise; - } - - /** @inheritdoc */ - public override then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, - ): Promise { - return this.unwrap().then(onfulfilled, onrejected); - } - - /** @inheritdoc */ - public override catch( - onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, - ): Promise { - return this.unwrap().catch(onrejected); - } - - /** @inheritdoc */ - public override finally(onfinally?: (() => void) | null): Promise { - return this.unwrap().finally(onfinally); - } - - /** - * Retrieves the data and raw response. - * - * @returns A promise resolving to a `WithRawResponse` object. - */ - public async withRawResponse(): Promise> { - return await this.innerPromise; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts deleted file mode 100644 index 37fb44e2aa99..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/RawResponse.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Headers } from "./Headers.js"; - -/** - * The raw response from the fetch call excluding the body. - */ -export type RawResponse = Omit< - { - [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions - }, - "ok" | "body" | "bodyUsed" ->; // strips out body and bodyUsed - -/** - * A raw response indicating that the request was aborted. - */ -export const abortRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 499, - statusText: "Client Closed Request", - type: "error", - url: "", -} as const; - -/** - * A raw response indicating an unknown error. - */ -export const unknownRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 0, - statusText: "Unknown Error", - type: "error", - url: "", -} as const; - -/** - * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, - * excluding the `body` and `bodyUsed` fields. - * - * @param response - The `RawResponse` object to convert. - * @returns A `RawResponse` object containing the extracted properties of the input response. - */ -export function toRawResponse(response: Response): RawResponse { - return { - headers: response.headers, - redirected: response.redirected, - status: response.status, - statusText: response.statusText, - type: response.type, - url: response.url, - }; -} - -/** - * Creates a `RawResponse` from a standard `Response` object. - */ -export interface WithRawResponse { - readonly data: T; - readonly rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts deleted file mode 100644 index 867c931c02f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/Supplier.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type Supplier = T | Promise | (() => T | Promise); - -export const Supplier = { - get: async (supplier: Supplier): Promise => { - if (typeof supplier === "function") { - return (supplier as () => T)(); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts deleted file mode 100644 index 88e13265e112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/createRequestUrl.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { toQueryString } from "../url/qs.js"; - -export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { - const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); - return queryString ? `${baseUrl}?${queryString}` : baseUrl; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts deleted file mode 100644 index 7cf4e623c2f5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getErrorResponseBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { fromJson } from "../json.js"; -import { getResponseBody } from "./getResponseBody.js"; - -export async function getErrorResponseBody(response: Response): Promise { - let contentType = response.headers.get("Content-Type")?.toLowerCase(); - if (contentType == null || contentType.length === 0) { - return getResponseBody(response); - } - - if (contentType.indexOf(";") !== -1) { - contentType = contentType.split(";")[0]?.trim() ?? ""; - } - switch (contentType) { - case "application/hal+json": - case "application/json": - case "application/ld+json": - case "application/problem+json": - case "application/vnd.api+json": - case "text/json": { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - default: - if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - - // Fallback to plain text if content type is not recognized - // Even if no body is present, the response will be an empty string - return await response.text(); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts deleted file mode 100644 index 9f845b956392..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getFetchFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function getFetchFn(): Promise { - return fetch; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts deleted file mode 100644 index 50f922b0e87f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getHeader.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function getHeader(headers: Record, header: string): string | undefined { - for (const [headerKey, headerValue] of Object.entries(headers)) { - if (headerKey.toLowerCase() === header.toLowerCase()) { - return headerValue; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts deleted file mode 100644 index 91d9d81f50e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getRequestBody.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toJson } from "../json.js"; -import { toQueryString } from "../url/qs.js"; - -export declare namespace GetRequestBody { - interface Args { - body: unknown; - type: "json" | "file" | "bytes" | "form" | "other"; - } -} - -export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { - if (type === "form") { - return toQueryString(body, { arrayFormat: "repeat", encode: true }); - } - if (type.includes("json")) { - return toJson(body); - } else { - return body as BodyInit; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts deleted file mode 100644 index 708d55728f2b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/getResponseBody.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { fromJson } from "../json.js"; -import { getBinaryResponse } from "./BinaryResponse.js"; - -export async function getResponseBody(response: Response, responseType?: string): Promise { - switch (responseType) { - case "binary-response": - return getBinaryResponse(response); - case "blob": - return await response.blob(); - case "arrayBuffer": - return await response.arrayBuffer(); - case "sse": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - return response.body; - case "streaming": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - - return response.body; - - case "text": - return await response.text(); - } - - // if responseType is "json" or not specified, try to parse as JSON - const text = await response.text(); - if (text.length > 0) { - try { - const responseBody = fromJson(text); - return responseBody; - } catch (_err) { - return { - ok: false, - error: { - reason: "non-json", - statusCode: response.status, - rawBody: text, - }, - }; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts deleted file mode 100644 index c3bc6da20f49..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type { APIResponse } from "./APIResponse.js"; -export type { BinaryResponse } from "./BinaryResponse.js"; -export type { EndpointMetadata } from "./EndpointMetadata.js"; -export { EndpointSupplier } from "./EndpointSupplier.js"; -export type { Fetcher, FetchFunction } from "./Fetcher.js"; -export { fetcher } from "./Fetcher.js"; -export { getHeader } from "./getHeader.js"; -export { HttpResponsePromise } from "./HttpResponsePromise.js"; -export type { RawResponse, WithRawResponse } from "./RawResponse.js"; -export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts deleted file mode 100644 index 921565eb0063..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/makeRequest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { anySignal, getTimeoutSignal } from "./signals.js"; - -export const makeRequest = async ( - fetchFn: (url: string, init: RequestInit) => Promise, - url: string, - method: string, - headers: Headers | Record, - requestBody: BodyInit | undefined, - timeoutMs?: number, - abortSignal?: AbortSignal, - withCredentials?: boolean, - duplex?: "half", -): Promise => { - const signals: AbortSignal[] = []; - - let timeoutAbortId: ReturnType | undefined; - if (timeoutMs != null) { - const { signal, abortId } = getTimeoutSignal(timeoutMs); - timeoutAbortId = abortId; - signals.push(signal); - } - - if (abortSignal != null) { - signals.push(abortSignal); - } - const newSignals = anySignal(signals); - const response = await fetchFn(url, { - method: method, - headers, - body: requestBody, - signal: newSignals, - credentials: withCredentials ? "include" : undefined, - // @ts-ignore - duplex, - }); - - if (timeoutAbortId != null) { - clearTimeout(timeoutAbortId); - } - - return response; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts deleted file mode 100644 index 1f689688c4b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/requestWithRetries.ts +++ /dev/null @@ -1,64 +0,0 @@ -const INITIAL_RETRY_DELAY = 1000; // in milliseconds -const MAX_RETRY_DELAY = 60000; // in milliseconds -const DEFAULT_MAX_RETRIES = 2; -const JITTER_FACTOR = 0.2; // 20% random jitter - -function addPositiveJitter(delay: number): number { - const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function addSymmetricJitter(delay: number): number { - const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { - const retryAfter = response.headers.get("Retry-After"); - if (retryAfter) { - const retryAfterSeconds = parseInt(retryAfter, 10); - if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { - return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); - } - - const retryAfterDate = new Date(retryAfter); - if (!Number.isNaN(retryAfterDate.getTime())) { - const delay = retryAfterDate.getTime() - Date.now(); - if (delay > 0) { - return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); - } - } - } - - const rateLimitReset = response.headers.get("X-RateLimit-Reset"); - if (rateLimitReset) { - const resetTime = parseInt(rateLimitReset, 10); - if (!Number.isNaN(resetTime)) { - const delay = resetTime * 1000 - Date.now(); - if (delay > 0) { - return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); - } - } - } - - return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); -} - -export async function requestWithRetries( - requestFn: () => Promise, - maxRetries: number = DEFAULT_MAX_RETRIES, -): Promise { - let response: Response = await requestFn(); - - for (let i = 0; i < maxRetries; ++i) { - if ([408, 429].includes(response.status) || response.status >= 500) { - const delay = getRetryDelayFromHeaders(response, i); - - await new Promise((resolve) => setTimeout(resolve, delay)); - response = await requestFn(); - } else { - break; - } - } - return response!; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts deleted file mode 100644 index 7bd3757ec3a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/fetcher/signals.ts +++ /dev/null @@ -1,26 +0,0 @@ -const TIMEOUT = "timeout"; - -export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { - const controller = new AbortController(); - const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); - return { signal: controller.signal, abortId }; -} - -export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { - const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; - - const controller = new AbortController(); - - for (const signal of signals) { - if (signal.aborted) { - controller.abort((signal as any)?.reason); - break; - } - - signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { - signal: controller.signal, - }); - } - - return controller.signal; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts deleted file mode 100644 index 78ed8b500c95..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/headers.ts +++ /dev/null @@ -1,35 +0,0 @@ -export function mergeHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } else if (insensitiveKey in result) { - delete result[insensitiveKey]; - } - } - - return result; -} - -export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } - } - - return result; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts deleted file mode 100644 index 92290bfadcac..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from "./auth/index.js"; -export * from "./base64.js"; -export * from "./fetcher/index.js"; -export * as logging from "./logging/index.js"; -export * from "./runtime/index.js"; -export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts deleted file mode 100644 index c052f3249f4f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/json.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Serialize a value to JSON - * @param value A JavaScript value, usually an object or array, to be converted. - * @param replacer A function that transforms the results. - * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. - * @returns JSON string - */ -export const toJson = ( - value: unknown, - replacer?: (this: unknown, key: string, value: unknown) => unknown, - space?: string | number, -): string => { - return JSON.stringify(value, replacer, space); -}; - -/** - * Parse JSON string to object, array, or other type - * @param text A valid JSON string. - * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. - * @returns Parsed object, array, or other type - */ -export function fromJson( - text: string, - reviver?: (this: unknown, key: string, value: unknown) => unknown, -): T { - return JSON.parse(text, reviver); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts deleted file mode 100644 index 88f6c00db0cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/exports.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as logger from "./logger.js"; - -export namespace logging { - /** - * Configuration for logger instances. - */ - export type LogConfig = logger.LogConfig; - export type LogLevel = logger.LogLevel; - export const LogLevel: typeof logger.LogLevel = logger.LogLevel; - export type ILogger = logger.ILogger; - /** - * Console logger implementation that outputs to the console. - */ - export type ConsoleLogger = logger.ConsoleLogger; - /** - * Console logger implementation that outputs to the console. - */ - export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts deleted file mode 100644 index d81cc32c40f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts deleted file mode 100644 index a3f3673cda93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/logging/logger.ts +++ /dev/null @@ -1,203 +0,0 @@ -export const LogLevel = { - Debug: "debug", - Info: "info", - Warn: "warn", - Error: "error", -} as const; -export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; -const logLevelMap: Record = { - [LogLevel.Debug]: 1, - [LogLevel.Info]: 2, - [LogLevel.Warn]: 3, - [LogLevel.Error]: 4, -}; - -export interface ILogger { - /** - * Logs a debug message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - debug(message: string, ...args: unknown[]): void; - /** - * Logs an info message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - info(message: string, ...args: unknown[]): void; - /** - * Logs a warning message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - warn(message: string, ...args: unknown[]): void; - /** - * Logs an error message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - error(message: string, ...args: unknown[]): void; -} - -/** - * Configuration for logger initialization. - */ -export interface LogConfig { - /** - * Minimum log level to output. - * @default LogLevel.Info - */ - level?: LogLevel; - /** - * Logger implementation to use. - * @default new ConsoleLogger() - */ - logger?: ILogger; - /** - * Whether logging should be silenced. - * @default true - */ - silent?: boolean; -} - -/** - * Default console-based logger implementation. - */ -export class ConsoleLogger implements ILogger { - debug(message: string, ...args: unknown[]): void { - console.debug(message, ...args); - } - info(message: string, ...args: unknown[]): void { - console.info(message, ...args); - } - warn(message: string, ...args: unknown[]): void { - console.warn(message, ...args); - } - error(message: string, ...args: unknown[]): void { - console.error(message, ...args); - } -} - -/** - * Logger class that provides level-based logging functionality. - */ -export class Logger { - private readonly level: number; - private readonly logger: ILogger; - private readonly silent: boolean; - - /** - * Creates a new logger instance. - * @param config - Logger configuration - */ - constructor(config: Required) { - this.level = logLevelMap[config.level]; - this.logger = config.logger; - this.silent = config.silent; - } - - /** - * Checks if a log level should be output based on configuration. - * @param level - The log level to check - * @returns True if the level should be logged - */ - public shouldLog(level: LogLevel): boolean { - return !this.silent && this.level <= logLevelMap[level]; - } - - /** - * Checks if debug logging is enabled. - * @returns True if debug logs should be output - */ - public isDebug(): boolean { - return this.shouldLog(LogLevel.Debug); - } - - /** - * Logs a debug message if debug logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public debug(message: string, ...args: unknown[]): void { - if (this.isDebug()) { - this.logger.debug(message, ...args); - } - } - - /** - * Checks if info logging is enabled. - * @returns True if info logs should be output - */ - public isInfo(): boolean { - return this.shouldLog(LogLevel.Info); - } - - /** - * Logs an info message if info logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public info(message: string, ...args: unknown[]): void { - if (this.isInfo()) { - this.logger.info(message, ...args); - } - } - - /** - * Checks if warning logging is enabled. - * @returns True if warning logs should be output - */ - public isWarn(): boolean { - return this.shouldLog(LogLevel.Warn); - } - - /** - * Logs a warning message if warning logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public warn(message: string, ...args: unknown[]): void { - if (this.isWarn()) { - this.logger.warn(message, ...args); - } - } - - /** - * Checks if error logging is enabled. - * @returns True if error logs should be output - */ - public isError(): boolean { - return this.shouldLog(LogLevel.Error); - } - - /** - * Logs an error message if error logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public error(message: string, ...args: unknown[]): void { - if (this.isError()) { - this.logger.error(message, ...args); - } - } -} - -export function createLogger(config?: LogConfig | Logger): Logger { - if (config == null) { - return defaultLogger; - } - if (config instanceof Logger) { - return config; - } - config = config ?? {}; - config.level ??= LogLevel.Info; - config.logger ??= new ConsoleLogger(); - config.silent ??= true; - return new Logger(config as Required); -} - -const defaultLogger: Logger = new Logger({ - level: LogLevel.Info, - logger: new ConsoleLogger(), - silent: true, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts deleted file mode 100644 index cfab23f9a834..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts deleted file mode 100644 index 56ebbb87c4d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/runtime/runtime.ts +++ /dev/null @@ -1,134 +0,0 @@ -interface DenoGlobal { - version: { - deno: string; - }; -} - -interface BunGlobal { - version: string; -} - -declare const Deno: DenoGlobal | undefined; -declare const Bun: BunGlobal | undefined; -declare const EdgeRuntime: string | undefined; -declare const self: typeof globalThis.self & { - importScripts?: unknown; -}; - -/** - * A constant that indicates which environment and version the SDK is running in. - */ -export const RUNTIME: Runtime = evaluateRuntime(); - -export interface Runtime { - type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; - version?: string; - parsedVersion?: number; -} - -function evaluateRuntime(): Runtime { - /** - * A constant that indicates whether the environment the code is running is a Web Browser. - */ - const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - if (isBrowser) { - return { - type: "browser", - version: window.navigator.userAgent, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Cloudflare. - * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent - */ - const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; - if (isCloudflare) { - return { - type: "workerd", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Edge Runtime. - * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime - */ - const isEdgeRuntime = typeof EdgeRuntime === "string"; - if (isEdgeRuntime) { - return { - type: "edge-runtime", - }; - } - - /** - * A constant that indicates whether the environment the code is running is a Web Worker. - */ - const isWebWorker = - typeof self === "object" && - typeof self?.importScripts === "function" && - (self.constructor?.name === "DedicatedWorkerGlobalScope" || - self.constructor?.name === "ServiceWorkerGlobalScope" || - self.constructor?.name === "SharedWorkerGlobalScope"); - if (isWebWorker) { - return { - type: "web-worker", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Deno. - * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions - */ - const isDeno = - typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - if (isDeno) { - return { - type: "deno", - version: Deno.version.deno, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Bun.sh. - */ - const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; - if (isBun) { - return { - type: "bun", - version: Bun.version, - }; - } - - /** - * A constant that indicates whether the environment the code is running is in React-Native. - * This check should come before Node.js detection since React Native may have a process polyfill. - * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js - */ - const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; - if (isReactNative) { - return { - type: "react-native", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ - const isNode = - typeof process !== "undefined" && - "version" in process && - !!process.version && - "versions" in process && - !!process.versions?.node; - if (isNode) { - return { - type: "node", - version: process.versions.node, - parsedVersion: Number(process.versions.node.split(".")[0]), - }; - } - - return { - type: "unknown", - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts deleted file mode 100644 index 19b901244218..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/encodePathParam.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function encodePathParam(param: unknown): string { - if (param === null) { - return "null"; - } - const typeofParam = typeof param; - switch (typeofParam) { - case "undefined": - return "undefined"; - case "string": - case "number": - case "boolean": - break; - default: - param = String(param); - break; - } - return encodeURIComponent(param as string | number | boolean); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts deleted file mode 100644 index f2e0fa2d2221..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { encodePathParam } from "./encodePathParam.js"; -export { join } from "./join.js"; -export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts deleted file mode 100644 index 7ca7daef094d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/join.ts +++ /dev/null @@ -1,79 +0,0 @@ -export function join(base: string, ...segments: string[]): string { - if (!base) { - return ""; - } - - if (segments.length === 0) { - return base; - } - - if (base.includes("://")) { - let url: URL; - try { - url = new URL(base); - } catch { - return joinPath(base, ...segments); - } - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - url.pathname = joinPathSegments(url.pathname, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { - url.pathname += "/"; - } - - return url.toString(); - } - - return joinPath(base, ...segments); -} - -function joinPath(base: string, ...segments: string[]): string { - if (segments.length === 0) { - return base; - } - - let result = base; - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - result = joinPathSegments(result, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !result.endsWith("/")) { - result += "/"; - } - - return result; -} - -function joinPathSegments(left: string, right: string): string { - if (left.endsWith("/")) { - return left + right; - } - return `${left}/${right}`; -} - -function trimSlashes(str: string): string { - if (!str) return str; - - let start = 0; - let end = str.length; - - if (str.startsWith("/")) start = 1; - if (str.endsWith("/")) end = str.length - 1; - - return start === 0 && end === str.length ? str : str.slice(start, end); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts deleted file mode 100644 index 13e89be9d9a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/core/url/qs.ts +++ /dev/null @@ -1,74 +0,0 @@ -interface QueryStringOptions { - arrayFormat?: "indices" | "repeat"; - encode?: boolean; -} - -const defaultQsOptions: Required = { - arrayFormat: "indices", - encode: true, -} as const; - -function encodeValue(value: unknown, shouldEncode: boolean): string { - if (value === undefined) { - return ""; - } - if (value === null) { - return ""; - } - const stringValue = String(value); - return shouldEncode ? encodeURIComponent(stringValue) : stringValue; -} - -function stringifyObject(obj: Record, prefix = "", options: Required): string[] { - const parts: string[] = []; - - for (const [key, value] of Object.entries(obj)) { - const fullKey = prefix ? `${prefix}[${key}]` : key; - - if (value === undefined) { - continue; - } - - if (Array.isArray(value)) { - if (value.length === 0) { - continue; - } - for (let i = 0; i < value.length; i++) { - const item = value[i]; - if (item === undefined) { - continue; - } - if (typeof item === "object" && !Array.isArray(item) && item !== null) { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - parts.push(...stringifyObject(item as Record, arrayKey, options)); - } else { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; - parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); - } - } - } else if (typeof value === "object" && value !== null) { - if (Object.keys(value as Record).length === 0) { - continue; - } - parts.push(...stringifyObject(value as Record, fullKey, options)); - } else { - const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; - parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); - } - } - - return parts; -} - -export function toQueryString(obj: unknown, options?: QueryStringOptions): string { - if (obj == null || typeof obj !== "object") { - return ""; - } - - const parts = stringifyObject(obj as Record, "", { - ...defaultQsOptions, - ...options, - }); - return parts.join("&"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts deleted file mode 100644 index d2e515f5d4e2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveError.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import { toJson } from "../core/json.js"; - -export class SeedExhaustiveError extends Error { - public readonly statusCode?: number; - public readonly body?: unknown; - public readonly rawResponse?: core.RawResponse; - - constructor({ - message, - statusCode, - body, - rawResponse, - }: { - message?: string; - statusCode?: number; - body?: unknown; - rawResponse?: core.RawResponse; - }) { - super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - this.statusCode = statusCode; - this.body = body; - this.rawResponse = rawResponse; - } -} - -function buildMessage({ - message, - statusCode, - body, -}: { - message: string | undefined; - statusCode: number | undefined; - body: unknown | undefined; -}): string { - const lines: string[] = []; - if (message != null) { - lines.push(message); - } - - if (statusCode != null) { - lines.push(`Status code: ${statusCode.toString()}`); - } - - if (body != null) { - lines.push(`Body: ${toJson(body, undefined, 2)}`); - } - - return lines.join("\n"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts deleted file mode 100644 index 82a3cb8de266..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/SeedExhaustiveTimeoutError.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export class SeedExhaustiveTimeoutError extends Error { - constructor(message: string) { - super(message); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts deleted file mode 100644 index deb55c602654..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/handleNonStatusCodeError.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import * as errors from "./index.js"; - -export function handleNonStatusCodeError( - error: core.Fetcher.Error, - rawResponse: core.RawResponse, - method: string, - path: string, -): never { - switch (error.reason) { - case "non-json": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - body: error.rawBody, - rawResponse: rawResponse, - }); - case "body-is-null": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - rawResponse: rawResponse, - }); - case "timeout": - throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); - case "unknown": - throw new errors.SeedExhaustiveError({ - message: error.errorMessage, - rawResponse: rawResponse, - }); - default: - throw new errors.SeedExhaustiveError({ - message: "Unknown error", - rawResponse: rawResponse, - }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts deleted file mode 100644 index 2e2853073a94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/errors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; -export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts deleted file mode 100644 index 7b70ee14fc02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts deleted file mode 100644 index 9ebdde6391a5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * as SeedExhaustive from "./api/index.js"; -export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -export { SeedExhaustiveClient } from "./Client.js"; -export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; -export * from "./exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts deleted file mode 100644 index b643a3e3ea27..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/src/version.ts +++ /dev/null @@ -1 +0,0 @@ -export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts deleted file mode 100644 index 7f5e031c8396..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/custom.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This is a custom test file, if you wish to add more tests - * to your SDK. - * Be sure to mark this file in `.fernignore`. - * - * If you include example requests/responses in your fern definition, - * you will have tests automatically generated for you. - */ -describe("test", () => { - it("default", () => { - expect(true).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts deleted file mode 100644 index 954872157d52..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { RequestHandlerOptions } from "msw"; -import type { SetupServer } from "msw/node"; - -import { mockEndpointBuilder } from "./mockEndpointBuilder"; - -export interface MockServerOptions { - baseUrl: string; - server: SetupServer; -} - -export class MockServer { - private readonly server: SetupServer; - public readonly baseUrl: string; - - constructor({ baseUrl, server }: MockServerOptions) { - this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; - this.server = server; - } - - public mockEndpoint(options?: RequestHandlerOptions): ReturnType { - const builder = mockEndpointBuilder({ - once: options?.once ?? true, - onBuild: (handler) => { - this.server.use(handler); - }, - }).baseUrl(this.baseUrl); - return builder; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts deleted file mode 100644 index e1a90f7fb2e3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/MockServerPool.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { setupServer } from "msw/node"; - -import { fromJson, toJson } from "../../src/core/json"; -import { MockServer } from "./MockServer"; -import { randomBaseUrl } from "./randomBaseUrl"; - -const mswServer = setupServer(); -interface MockServerOptions { - baseUrl?: string; -} - -async function formatHttpRequest(request: Request, id?: string): Promise { - try { - const clone = request.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Request ${id} ###\n` : ""; - const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting request: ${e}`; - } -} - -async function formatHttpResponse(response: Response, id?: string): Promise { - try { - const clone = response.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Response for ${id} ###\n` : ""; - const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting response: ${e}`; - } -} - -class MockServerPool { - private servers: MockServer[] = []; - - public createServer(options?: Partial): MockServer { - const baseUrl = options?.baseUrl || randomBaseUrl(); - const server = new MockServer({ baseUrl, server: mswServer }); - this.servers.push(server); - return server; - } - - public getServers(): MockServer[] { - return [...this.servers]; - } - - public listen(): void { - const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; - mswServer.listen({ onUnhandledRequest }); - - if (process.env.LOG_LEVEL === "debug") { - mswServer.events.on("request:start", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:start\n${formattedRequest}`); - }); - - mswServer.events.on("request:unhandled", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:unhandled\n${formattedRequest}`); - }); - - mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { - const formattedResponse = await formatHttpResponse(response, requestId); - console.debug(`response:mocked\n${formattedResponse}`); - }); - } - } - - public close(): void { - this.servers = []; - mswServer.close(); - } -} - -export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts deleted file mode 100644 index 1b0e51079e6b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/mockEndpointBuilder.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; - -import { url } from "../../src/core"; -import { toJson } from "../../src/core/json"; -import { withFormUrlEncoded } from "./withFormUrlEncoded"; -import { withHeaders } from "./withHeaders"; -import { withJson } from "./withJson"; - -type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; - -interface MethodStage { - baseUrl(baseUrl: string): MethodStage; - all(path: string): RequestHeadersStage; - get(path: string): RequestHeadersStage; - post(path: string): RequestHeadersStage; - put(path: string): RequestHeadersStage; - delete(path: string): RequestHeadersStage; - patch(path: string): RequestHeadersStage; - options(path: string): RequestHeadersStage; - head(path: string): RequestHeadersStage; -} - -interface RequestHeadersStage extends RequestBodyStage, ResponseStage { - header(name: string, value: string): RequestHeadersStage; - headers(headers: Record): RequestBodyStage; -} - -interface RequestBodyStage extends ResponseStage { - jsonBody(body: unknown): ResponseStage; - formUrlEncodedBody(body: unknown): ResponseStage; -} - -interface ResponseStage { - respondWith(): ResponseStatusStage; -} -interface ResponseStatusStage { - statusCode(statusCode: number): ResponseHeaderStage; -} - -interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { - header(name: string, value: string): ResponseHeaderStage; - headers(headers: Record): ResponseHeaderStage; -} - -interface ResponseBodyStage { - jsonBody(body: unknown): BuildStage; -} - -interface BuildStage { - build(): HttpHandler; -} - -export interface HttpHandlerBuilderOptions { - onBuild?: (handler: HttpHandler) => void; - once?: boolean; -} - -class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { - private method: HttpMethod = "get"; - private _baseUrl: string = ""; - private path: string = "/"; - private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - constructor(options?: HttpHandlerBuilderOptions) { - this.handlerOptions = options; - } - - baseUrl(baseUrl: string): MethodStage { - this._baseUrl = baseUrl; - return this; - } - - all(path: string): RequestHeadersStage { - this.method = "all"; - this.path = path; - return this; - } - - get(path: string): RequestHeadersStage { - this.method = "get"; - this.path = path; - return this; - } - - post(path: string): RequestHeadersStage { - this.method = "post"; - this.path = path; - return this; - } - - put(path: string): RequestHeadersStage { - this.method = "put"; - this.path = path; - return this; - } - - delete(path: string): RequestHeadersStage { - this.method = "delete"; - this.path = path; - return this; - } - - patch(path: string): RequestHeadersStage { - this.method = "patch"; - this.path = path; - return this; - } - - options(path: string): RequestHeadersStage { - this.method = "options"; - this.path = path; - return this; - } - - head(path: string): RequestHeadersStage { - this.method = "head"; - this.path = path; - return this; - } - - header(name: string, value: string): RequestHeadersStage { - this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); - return this; - } - - headers(headers: Record): RequestBodyStage { - this.predicates.push((resolver) => withHeaders(headers, resolver)); - return this; - } - - jsonBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); - } - this.predicates.push((resolver) => withJson(body, resolver)); - return this; - } - - formUrlEncodedBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error( - "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", - ); - } - this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); - return this; - } - - respondWith(): ResponseStatusStage { - return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); - } - - private buildUrl(): string { - return url.join(this._baseUrl, this.path); - } -} - -class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { - private readonly method: HttpMethod; - private readonly url: string; - private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - private responseStatusCode: number = 200; - private responseHeaders: Record = {}; - private responseBody: DefaultBodyType = undefined; - - constructor( - method: HttpMethod, - url: string, - requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], - options?: HttpHandlerBuilderOptions, - ) { - this.method = method; - this.url = url; - this.requestPredicates = requestPredicates; - this.handlerOptions = options; - } - - public statusCode(code: number): ResponseHeaderStage { - this.responseStatusCode = code; - return this; - } - - public header(name: string, value: string): ResponseHeaderStage { - this.responseHeaders[name] = value; - return this; - } - - public headers(headers: Record): ResponseHeaderStage { - this.responseHeaders = { ...this.responseHeaders, ...headers }; - return this; - } - - public jsonBody(body: unknown): BuildStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); - } - this.responseBody = toJson(body); - return this; - } - - public build(): HttpHandler { - const responseResolver: HttpResponseResolver = () => { - const response = new HttpResponse(this.responseBody, { - status: this.responseStatusCode, - headers: this.responseHeaders, - }); - // if no Content-Type header is set, delete the default text content type that is set - if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { - response.headers.delete("Content-Type"); - } - return response; - }; - - const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); - - const handler = http[this.method](this.url, finalResolver, this.handlerOptions); - this.handlerOptions?.onBuild?.(handler); - return handler; - } -} - -export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { - return new RequestBuilder(options); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts deleted file mode 100644 index 031aa6408aca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/randomBaseUrl.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function randomBaseUrl(): string { - const randomString = Math.random().toString(36).substring(2, 15); - return `http://${randomString}.localhost`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts deleted file mode 100644 index aeb3a95af7dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { afterAll, beforeAll } from "vitest"; - -import { mockServerPool } from "./MockServerPool"; - -beforeAll(() => { - mockServerPool.listen(); -}); -afterAll(() => { - mockServerPool.close(); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts deleted file mode 100644 index e9e6ff2d9cf1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withFormUrlEncoded.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: Record; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a form-urlencoded body."); - return passthrough(); - } - const params = new URLSearchParams(bodyText); - actualBody = {}; - for (const [key, value] of params.entries()) { - actualBody[key] = value; - } - } catch (error) { - console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).length > 0) { - console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - return { value: { actual, expected } }; - } - return {}; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if (actual[key] !== expected[key]) { - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts deleted file mode 100644 index 6599d2b4a92d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withHeaders.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -/** - * Creates a request matcher that validates if request headers match specified criteria - * @param expectedHeaders - Headers to match against - * @param resolver - Response resolver to execute if headers match - */ -export function withHeaders( - expectedHeaders: Record boolean)>, - resolver: HttpResponseResolver, -): HttpResponseResolver { - return (args) => { - const { request } = args; - const { headers } = request; - - const mismatches: Record< - string, - { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } - > = {}; - - for (const [key, expectedValue] of Object.entries(expectedHeaders)) { - const actualValue = headers.get(key); - - if (actualValue === null) { - mismatches[key] = { actual: null, expected: expectedValue }; - continue; - } - - if (typeof expectedValue === "function") { - if (!expectedValue(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue instanceof RegExp) { - if (!expectedValue.test(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue !== actualValue) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } - - if (Object.keys(mismatches).length > 0) { - const formattedMismatches = formatHeaderMismatches(mismatches); - console.error("Header mismatch:", formattedMismatches); - return passthrough(); - } - - return resolver(args); - }; -} - -function formatHeaderMismatches( - mismatches: Record boolean) }>, -): Record { - const formatted: Record = {}; - - for (const [key, { actual, expected }] of Object.entries(mismatches)) { - formatted[key] = { - actual, - expected: - expected instanceof RegExp - ? expected.toString() - : typeof expected === "function" - ? "[Function]" - : expected, - }; - } - - return formatted; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts deleted file mode 100644 index b627638b015f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/mock-server/withJson.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { fromJson, toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request JSON body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: unknown; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a JSON object."); - return passthrough(); - } - actualBody = fromJson(bodyText); - } catch (error) { - console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { - console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - return {}; - } - - if (Array.isArray(actual) && Array.isArray(expected)) { - if (actual.length !== expected.length) { - return { length: { actual: actual.length, expected: expected.length } }; - } - - const arrayMismatches: Record = {}; - for (let i = 0; i < actual.length; i++) { - const itemMismatches = findMismatches(actual[i], expected[i]); - if (Object.keys(itemMismatches).length > 0) { - for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { - arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; - } - } - } - return arrayMismatches; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; // Skip undefined values in actual - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; // Skip undefined values in expected - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if ( - typeof actual[key] === "object" && - actual[key] !== null && - typeof expected[key] === "object" && - expected[key] !== null - ) { - const nestedMismatches = findMismatches(actual[key], expected[key]); - if (Object.keys(nestedMismatches).length > 0) { - for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { - mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; - } - } - } else if (actual[key] !== expected[key]) { - if (areEquivalent(actual[key], expected[key])) { - continue; - } - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} - -function areEquivalent(actual: unknown, expected: unknown): boolean { - if (actual === expected) { - return true; - } - if (isEquivalentBigInt(actual, expected)) { - return true; - } - if (isEquivalentDatetime(actual, expected)) { - return true; - } - return false; -} - -function isEquivalentBigInt(actual: unknown, expected: unknown) { - if (typeof actual === "number") { - actual = BigInt(actual); - } - if (typeof expected === "number") { - expected = BigInt(expected); - } - if (typeof actual === "bigint" && typeof expected === "bigint") { - return actual === expected; - } - return false; -} - -function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { - if (typeof str1 !== "string" || typeof str2 !== "string") { - return false; - } - const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; - if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { - return false; - } - - try { - const date1 = new Date(str1).getTime(); - const date2 = new Date(str2).getTime(); - return date1 === date2; - } catch { - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts deleted file mode 100644 index a5651f81ba10..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/setup.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { expect } from "vitest"; - -interface CustomMatchers { - toContainHeaders(expectedHeaders: Record): R; -} - -declare module "vitest" { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} - -expect.extend({ - toContainHeaders(actual: unknown, expectedHeaders: Record) { - const isHeaders = actual instanceof Headers; - const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); - - if (!isHeaders && !isPlainObject) { - throw new TypeError("Received value must be an instance of Headers or a plain object!"); - } - - if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { - throw new TypeError("Expected headers must be a plain object!"); - } - - const missingHeaders: string[] = []; - const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; - - for (const [key, value] of Object.entries(expectedHeaders)) { - let actualValue: string | null = null; - - if (isHeaders) { - // Headers.get() is already case-insensitive - actualValue = (actual as Headers).get(key); - } else { - // For plain objects, do case-insensitive lookup - const actualObj = actual as Record; - const lowerKey = key.toLowerCase(); - const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); - actualValue = foundKey ? actualObj[foundKey] : null; - } - - if (actualValue === null || actualValue === undefined) { - missingHeaders.push(key); - } else if (actualValue !== value) { - mismatchedHeaders.push({ key, expected: value, actual: actualValue }); - } - } - - const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; - - const actualType = isHeaders ? "Headers" : "object"; - - if (pass) { - return { - message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, - pass: true, - }; - } else { - const messages: string[] = []; - - if (missingHeaders.length > 0) { - messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); - } - - if (mismatchedHeaders.length > 0) { - const mismatches = mismatchedHeaders.map( - ({ key, expected, actual }) => - `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, - ); - messages.push(mismatches.join("\n")); - } - - return { - message: () => - `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, - pass: false, - }; - } - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json deleted file mode 100644 index a477df47920c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": null, - "rootDir": "..", - "baseUrl": "..", - "types": ["vitest/globals"] - }, - "include": ["../src", "../tests"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts deleted file mode 100644 index 9b5123364c47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BasicAuth.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { BasicAuth } from "../../../src/core/auth/BasicAuth"; - -describe("BasicAuth", () => { - interface ToHeaderTestCase { - description: string; - input: { username: string; password: string }; - expected: string; - } - - interface FromHeaderTestCase { - description: string; - input: string; - expected: { username: string; password: string }; - } - - interface ErrorTestCase { - description: string; - input: string; - expectedError: string; - } - - describe("toAuthorizationHeader", () => { - const toHeaderTests: ToHeaderTestCase[] = [ - { - description: "correctly converts to header", - input: { username: "username", password: "password" }, - expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - }, - ]; - - toHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); - }); - }); - }); - - describe("fromAuthorizationHeader", () => { - const fromHeaderTests: FromHeaderTestCase[] = [ - { - description: "correctly parses header", - input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - expected: { username: "username", password: "password" }, - }, - { - description: "handles password with colons", - input: "Basic dXNlcjpwYXNzOndvcmQ=", - expected: { username: "user", password: "pass:word" }, - }, - { - description: "handles empty username and password (just colon)", - input: "Basic Og==", - expected: { username: "", password: "" }, - }, - { - description: "handles empty username", - input: "Basic OnBhc3N3b3Jk", - expected: { username: "", password: "password" }, - }, - { - description: "handles empty password", - input: "Basic dXNlcm5hbWU6", - expected: { username: "username", password: "" }, - }, - ]; - - fromHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); - }); - }); - - const errorTests: ErrorTestCase[] = [ - { - description: "throws error for completely empty credentials", - input: "Basic ", - expectedError: "Invalid basic auth", - }, - { - description: "throws error for credentials without colon", - input: "Basic dXNlcm5hbWU=", - expectedError: "Invalid basic auth", - }, - ]; - - errorTests.forEach(({ description, input, expectedError }) => { - it(description, () => { - expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts deleted file mode 100644 index 7757b87cb97e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/auth/BearerToken.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BearerToken } from "../../../src/core/auth/BearerToken"; - -describe("BearerToken", () => { - describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); - }); - }); - describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts deleted file mode 100644 index 939594ca277b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/base64.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { base64Decode, base64Encode } from "../../src/core/base64"; - -describe("base64", () => { - describe("base64Encode", () => { - it("should encode ASCII strings", () => { - expect(base64Encode("hello")).toBe("aGVsbG8="); - expect(base64Encode("")).toBe(""); - }); - - it("should encode UTF-8 strings", () => { - expect(base64Encode("café")).toBe("Y2Fmw6k="); - expect(base64Encode("🎉")).toBe("8J+OiQ=="); - }); - - it("should handle basic auth credentials", () => { - expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); - }); - }); - - describe("base64Decode", () => { - it("should decode ASCII strings", () => { - expect(base64Decode("aGVsbG8=")).toBe("hello"); - expect(base64Decode("")).toBe(""); - }); - - it("should decode UTF-8 strings", () => { - expect(base64Decode("Y2Fmw6k=")).toBe("café"); - expect(base64Decode("8J+OiQ==")).toBe("🎉"); - }); - - it("should handle basic auth credentials", () => { - expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); - }); - }); - - describe("round-trip encoding", () => { - const testStrings = [ - "hello world", - "test@example.com", - "café", - "username:password", - "user@domain.com:super$ecret123!", - ]; - - testStrings.forEach((testString) => { - it(`should round-trip encode/decode: "${testString}"`, () => { - const encoded = base64Encode(testString); - const decoded = base64Decode(encoded); - expect(decoded).toBe(testString); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts deleted file mode 100644 index 60df2b5e4824..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/Fetcher.test.ts +++ /dev/null @@ -1,261 +0,0 @@ -import fs from "fs"; -import { join } from "path"; -import stream from "stream"; -import type { BinaryResponse } from "../../../src/core"; -import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -describe("Test fetcherImpl", () => { - it("should handle successful request", async () => { - const mockArgs: Fetcher.Args = { - url: "https://httpbin.org/post", - method: "POST", - headers: { "X-Test": "x-test-header" }, - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - maxRetries: 0, - responseType: "json", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - - expect(global.fetch).toHaveBeenCalledWith( - "https://httpbin.org/post", - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: JSON.stringify({ data: "test" }), - }), - ); - }); - - it("should send octet stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "POST", - headers: { "X-Test": "x-test-header" }, - contentType: "application/octet-stream", - requestType: "bytes", - maxRetries: 0, - responseType: "json", - body: fs.createReadStream(join(__dirname, "test-file.txt")), - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: expect.any(fs.ReadStream), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - }); - - it("should receive file as stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.stream).toBe("function"); - const stream = body.stream(); - expect(stream).toBeInstanceOf(ReadableStream); - const reader = stream.getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as blob", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.blob).toBe("function"); - const blob = await body.blob(); - expect(blob).toBeInstanceOf(Blob); - const reader = blob.stream().getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as arraybuffer", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.arrayBuffer).toBe("function"); - const arrayBuffer = await body.arrayBuffer(); - expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as bytes", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.bytes).toBe("function"); - if (!body.bytes) { - return; - } - const bytes = await body.bytes(); - expect(bytes).toBeInstanceOf(Uint8Array); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(bytes); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts deleted file mode 100644 index 2ec008e581d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/HttpResponsePromise.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; - -import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; -import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("HttpResponsePromise", () => { - const mockRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - const mockData = { id: "123", name: "test" }; - const mockWithRawResponse: WithRawResponse = { - data: mockData, - rawResponse: mockRawResponse, - }; - - describe("fromFunction", () => { - it("should create an HttpResponsePromise from a function", async () => { - const mockFn = vi - .fn<(arg1: string, arg2: string) => Promise>>() - .mockResolvedValue(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); - - const result = await responsePromise; - expect(result).toEqual(mockData); - expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromPromise", () => { - it("should create an HttpResponsePromise from a promise", async () => { - const promise = Promise.resolve(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromPromise(promise); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromExecutor", () => { - it("should create an HttpResponsePromise from an executor function", async () => { - const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { - resolve(mockWithRawResponse); - }); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromResult", () => { - it("should create an HttpResponsePromise from a result", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("Promise methods", () => { - let responsePromise: HttpResponsePromise; - - beforeEach(() => { - responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - }); - - it("should support then() method", async () => { - const result = await responsePromise.then((data) => ({ - ...data, - modified: true, - })); - - expect(result).toEqual({ - ...mockData, - modified: true, - }); - }); - - it("should support catch() method", async () => { - const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { - reject(new Error("Test error")); - }); - - const catchSpy = vi.fn(); - await errorResponsePromise.catch(catchSpy); - - expect(catchSpy).toHaveBeenCalled(); - const error = catchSpy.mock.calls[0]?.[0]; - expect(error).toBeInstanceOf(Error); - expect((error as Error).message).toBe("Test error"); - }); - - it("should support finally() method", async () => { - const finallySpy = vi.fn(); - await responsePromise.finally(finallySpy); - - expect(finallySpy).toHaveBeenCalled(); - }); - }); - - describe("withRawResponse", () => { - it("should return both data and raw response", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise.withRawResponse(); - - expect(result).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts deleted file mode 100644 index 375ee3f38064..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/RawResponse.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("RawResponse", () => { - describe("toRawResponse", () => { - it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { - const mockHeaders = new Headers({ "content-type": "application/json" }); - const mockResponse = { - body: "test body", - bodyUsed: false, - ok: true, - headers: mockHeaders, - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - - const result = toRawResponse(mockResponse as unknown as Response); - - expect("body" in result).toBe(false); - expect("bodyUsed" in result).toBe(false); - expect("ok" in result).toBe(false); - expect(result.headers).toBe(mockHeaders); - expect(result.redirected).toBe(false); - expect(result.status).toBe(200); - expect(result.statusText).toBe("OK"); - expect(result.type).toBe("basic"); - expect(result.url).toBe("https://example.com"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts deleted file mode 100644 index a92f1b5e81d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/createRequestUrl.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; - -describe("Test createRequestUrl", () => { - const BASE_URL = "https://api.example.com"; - - interface TestCase { - description: string; - baseUrl: string; - queryParams?: Record; - expected: string; - } - - const testCases: TestCase[] = [ - { - description: "should return the base URL when no query parameters are provided", - baseUrl: BASE_URL, - expected: BASE_URL, - }, - { - description: "should append simple query parameters", - baseUrl: BASE_URL, - queryParams: { key: "value", another: "param" }, - expected: "https://api.example.com?key=value&another=param", - }, - { - description: "should handle array query parameters", - baseUrl: BASE_URL, - queryParams: { items: ["a", "b", "c"] }, - expected: "https://api.example.com?items=a&items=b&items=c", - }, - { - description: "should handle object query parameters", - baseUrl: BASE_URL, - queryParams: { filter: { name: "John", age: 30 } }, - expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", - }, - { - description: "should handle mixed types of query parameters", - baseUrl: BASE_URL, - queryParams: { - simple: "value", - array: ["x", "y"], - object: { key: "value" }, - }, - expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", - }, - { - description: "should handle empty query parameters object", - baseUrl: BASE_URL, - queryParams: {}, - expected: BASE_URL, - }, - { - description: "should encode special characters in query parameters", - baseUrl: BASE_URL, - queryParams: { special: "a&b=c d" }, - expected: "https://api.example.com?special=a%26b%3Dc%20d", - }, - { - description: "should handle numeric values", - baseUrl: BASE_URL, - queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, - expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", - }, - { - description: "should handle boolean values", - baseUrl: BASE_URL, - queryParams: { enabled: true, disabled: false }, - expected: "https://api.example.com?enabled=true&disabled=false", - }, - { - description: "should handle null and undefined values", - baseUrl: BASE_URL, - queryParams: { - valid: "value", - nullValue: null, - undefinedValue: undefined, - emptyString: "", - }, - expected: "https://api.example.com?valid=value&nullValue=&emptyString=", - }, - { - description: "should handle deeply nested objects", - baseUrl: BASE_URL, - queryParams: { - user: { - profile: { - name: "John", - settings: { theme: "dark" }, - }, - }, - }, - expected: - "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle arrays of objects", - baseUrl: BASE_URL, - queryParams: { - users: [ - { name: "John", age: 30 }, - { name: "Jane", age: 25 }, - ], - }, - expected: - "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", - }, - { - description: "should handle mixed arrays", - baseUrl: BASE_URL, - queryParams: { - mixed: ["string", 42, true, { key: "value" }], - }, - expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", - }, - { - description: "should handle empty arrays", - baseUrl: BASE_URL, - queryParams: { emptyArray: [] }, - expected: BASE_URL, - }, - { - description: "should handle empty objects", - baseUrl: BASE_URL, - queryParams: { emptyObject: {} }, - expected: BASE_URL, - }, - { - description: "should handle special characters in keys", - baseUrl: BASE_URL, - queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, - expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", - }, - { - description: "should handle URL with existing query parameters", - baseUrl: "https://api.example.com?existing=param", - queryParams: { new: "value" }, - expected: "https://api.example.com?existing=param?new=value", - }, - { - description: "should handle complex nested structures", - baseUrl: BASE_URL, - queryParams: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - ]; - - testCases.forEach(({ description, baseUrl, queryParams, expected }) => { - it(description, () => { - expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts deleted file mode 100644 index 8a6c3a57e211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getRequestBody.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getRequestBody", () => { - interface TestCase { - description: string; - input: any; - type: "json" | "form" | "file" | "bytes" | "other"; - expected: any; - skipCondition?: () => boolean; - } - - const testCases: TestCase[] = [ - { - description: "should stringify body if not FormData in Node environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "node", - }, - { - description: "should stringify body if not FormData in browser environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "browser", - }, - { - description: "should return the Uint8Array", - input: new Uint8Array([1, 2, 3]), - type: "bytes", - expected: new Uint8Array([1, 2, 3]), - }, - { - description: "should serialize objects for form-urlencoded content type", - input: { username: "johndoe", email: "john@example.com" }, - type: "form", - expected: "username=johndoe&email=john%40example.com", - }, - { - description: "should serialize complex nested objects and arrays for form-urlencoded content type", - input: { - user: { - profile: { - name: "John Doe", - settings: { - theme: "dark", - notifications: true, - }, - }, - tags: ["admin", "user"], - contacts: [ - { type: "email", value: "john@example.com" }, - { type: "phone", value: "+1234567890" }, - ], - }, - filters: { - status: ["active", "pending"], - metadata: { - created: "2024-01-01", - categories: ["electronics", "books"], - }, - }, - preferences: ["notifications", "updates"], - }, - type: "form", - expected: - "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + - "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + - "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + - "user%5Btags%5D=admin&" + - "user%5Btags%5D=user&" + - "user%5Bcontacts%5D%5Btype%5D=email&" + - "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + - "user%5Bcontacts%5D%5Btype%5D=phone&" + - "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + - "filters%5Bstatus%5D=active&" + - "filters%5Bstatus%5D=pending&" + - "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + - "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + - "filters%5Bmetadata%5D%5Bcategories%5D=books&" + - "preferences=notifications&" + - "preferences=updates", - }, - { - description: "should return the input for pre-serialized form-urlencoded strings", - input: "key=value&another=param", - type: "other", - expected: "key=value&another=param", - }, - { - description: "should JSON stringify objects", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - }, - ]; - - testCases.forEach(({ description, input, type, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const result = await getRequestBody({ - body: input, - type, - }); - - if (input instanceof Uint8Array) { - expect(result).toBe(input); - } else { - expect(result).toBe(expected); - } - }); - }); - - it("should return FormData in browser environment", async () => { - if (RUNTIME.type === "browser") { - const formData = new FormData(); - formData.append("key", "value"); - const result = await getRequestBody({ - body: formData, - type: "file", - }); - expect(result).toBe(formData); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts deleted file mode 100644 index ad6be7fc2c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/getResponseBody.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; - -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getResponseBody", () => { - interface SimpleTestCase { - description: string; - responseData: string | Record; - responseType?: "blob" | "sse" | "streaming" | "text"; - expected: any; - skipCondition?: () => boolean; - } - - const simpleTestCases: SimpleTestCase[] = [ - { - description: "should handle text response type", - responseData: "test text", - responseType: "text", - expected: "test text", - }, - { - description: "should handle JSON response", - responseData: { key: "value" }, - expected: { key: "value" }, - }, - { - description: "should handle empty response", - responseData: "", - expected: undefined, - }, - { - description: "should handle non-JSON response", - responseData: "invalid json", - expected: { - ok: false, - error: { - reason: "non-json", - statusCode: 200, - rawBody: "invalid json", - }, - }, - }, - ]; - - simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const mockResponse = new Response( - typeof responseData === "string" ? responseData : JSON.stringify(responseData), - ); - const result = await getResponseBody(mockResponse, responseType); - expect(result).toEqual(expected); - }); - }); - - it("should handle blob response type", async () => { - const mockBlob = new Blob(["test"], { type: "text/plain" }); - const mockResponse = new Response(mockBlob); - const result = await getResponseBody(mockResponse, "blob"); - // @ts-expect-error - expect(result.constructor.name).toBe("Blob"); - }); - - it("should handle sse response type", async () => { - if (RUNTIME.type === "node") { - const mockStream = new ReadableStream(); - const mockResponse = new Response(mockStream); - const result = await getResponseBody(mockResponse, "sse"); - expect(result).toBe(mockStream); - } - }); - - it("should handle streaming response type", async () => { - const encoder = new TextEncoder(); - const testData = "test stream data"; - const mockStream = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode(testData)); - controller.close(); - }, - }); - - const mockResponse = new Response(mockStream); - const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; - - expect(result).toBeInstanceOf(ReadableStream); - - const reader = result.getReader(); - const decoder = new TextDecoder(); - const { value } = await reader.read(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe(testData); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts deleted file mode 100644 index 366c9b6ced61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/logging.test.ts +++ /dev/null @@ -1,517 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Fetcher Logging Integration", () => { - describe("Request Logging", () => { - it("should log successful request at debug level", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - headers: { "Content-Type": "application/json" }, - body: { test: "data" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - }), - hasBody: true, - }), - ); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - statusCode: 200, - }), - ); - }); - - it("should not log debug messages at info level for successful requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "info", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - }); - - it("should log request with body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: true, - }), - ); - }); - - it("should log request without body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: false, - }), - ); - }); - - it("should not log when silent mode is enabled", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: true, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should not log when no logging config is provided", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Error Logging", () => { - it("should log 4xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Not found" }, 404, "Not Found"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 404, - }), - ); - }); - - it("should log 5xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 500, - }), - ); - }); - - it("should log aborted request errors", async () => { - const mockLogger = createMockLogger(); - - const abortController = new AbortController(); - abortController.abort(); - - global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - abortSignal: abortController.signal, - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request was aborted", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - }), - ); - }); - - it("should log timeout errors", async () => { - const mockLogger = createMockLogger(); - - const timeoutError = new Error("Request timeout"); - timeoutError.name = "AbortError"; - - global.fetch = vi.fn().mockRejectedValue(timeoutError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request timed out", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - timeoutMs: undefined, - }), - ); - }); - - it("should log unknown errors", async () => { - const mockLogger = createMockLogger(); - - const unknownError = new Error("Unknown error"); - - global.fetch = vi.fn().mockRejectedValue(unknownError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - errorMessage: "Unknown error", - }), - ); - }); - }); - - describe("Logging with Redaction", () => { - it("should redact sensitive data in error logs", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]", - }), - ); - }); - }); - - describe("Different HTTP Methods", () => { - it("should log GET requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "GET", - }), - ); - }); - - it("should log POST requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - }), - ); - }); - - it("should log PUT requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "PUT", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "PUT", - }), - ); - }); - - it("should log DELETE requests", async () => { - const mockLogger = createMockLogger(); - global.fetch = vi.fn().mockResolvedValue( - new Response(null, { - status: 200, - statusText: "OK", - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "DELETE", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "DELETE", - }), - ); - }); - }); - - describe("Status Code Logging", () => { - it("should log 2xx success status codes", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 201, - }), - ); - }); - - it("should log 3xx redirect status codes as success", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 301, - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts deleted file mode 100644 index ea49466a55fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/makeRequest.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Mock } from "vitest"; -import { makeRequest } from "../../../src/core/fetcher/makeRequest"; - -describe("Test makeRequest", () => { - const mockPostUrl = "https://httpbin.org/post"; - const mockGetUrl = "https://httpbin.org/get"; - const mockHeaders = { "Content-Type": "application/json" }; - const mockBody = JSON.stringify({ key: "value" }); - - let mockFetch: Mock; - - beforeEach(() => { - mockFetch = vi.fn(); - mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); - }); - - it("should handle POST request correctly", async () => { - const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockPostUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "POST", - headers: mockHeaders, - body: mockBody, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); - - it("should handle GET request correctly", async () => { - const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockGetUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "GET", - headers: mockHeaders, - body: undefined, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts deleted file mode 100644 index d599376b9bcf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/redacting.test.ts +++ /dev/null @@ -1,1115 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Redacting Logic", () => { - describe("Header Redaction", () => { - it("should redact authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Authorization: "Bearer secret-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - }), - }), - ); - }); - - it("should redact api-key header (case-insensitive)", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-API-KEY": "secret-api-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-API-KEY": "[REDACTED]", - }), - }), - ); - }); - - it("should redact cookie header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Cookie: "session=abc123; token=xyz789" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Cookie: "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-auth-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "x-auth-token": "auth-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "x-auth-token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact proxy-authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "Proxy-Authorization": "Basic credentials" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Proxy-Authorization": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-csrf-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-CSRF-Token": "csrf-token-abc" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-CSRF-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact www-authenticate header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "WWW-Authenticate": "Bearer realm=example" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "WWW-Authenticate": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-session-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-Session-Token": "session-token-xyz" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-Session-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive headers", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }), - }), - ); - }); - - it("should redact multiple sensitive headers at once", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - Authorization: "Bearer token", - "X-API-Key": "api-key", - Cookie: "session=123", - "Content-Type": "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - "X-API-Key": "[REDACTED]", - Cookie: "[REDACTED]", - "Content-Type": "application/json", - }), - }), - ); - }); - }); - - describe("Response Header Redaction", () => { - it("should redact Set-Cookie in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "set-cookie": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact authorization in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Authorization", "Bearer token-123"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - authorization: "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact response headers in error responses", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - statusText: "Unauthorized", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "www-authenticate": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - }); - - describe("Query Parameter Redaction", () => { - it("should redact api_key query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { api_key: "secret-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - api_key: "[REDACTED]", - }), - }), - ); - }); - - it("should redact token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact access_token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { access_token: "secret-access-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - access_token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact password query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { password: "secret-password" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - password: "[REDACTED]", - }), - }), - ); - }); - - it("should redact secret query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { secret: "secret-value" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - secret: "[REDACTED]", - }), - }), - ); - }); - - it("should redact session_id query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { session_id: "session-123" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - session_id: "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - page: "1", - limit: "10", - sort: "name", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - page: "1", - limit: "10", - sort: "name", - }), - }), - ); - }); - - it("should not redact parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - author: "john", - authenticate: "false", - authorization_level: "user", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - author: "john", - authenticate: "false", - authorization_level: "user", - }), - }), - ); - }); - - it("should handle undefined query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: undefined, - }), - ); - }); - - it("should redact case-insensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - API_KEY: "[REDACTED]", - Token: "[REDACTED]", - }), - }), - ); - }); - }); - - describe("URL Redaction", () => { - it("should redact credentials in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:password@example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api", - }), - ); - }); - - it("should redact api_key in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret-key&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&page=1", - }), - ); - }); - - it("should redact token in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret-token", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should redact password in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?username=user&password=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?username=user&password=[REDACTED]", - }), - ); - }); - - it("should not redact non-sensitive query strings", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name", - }), - ); - }); - - it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - }), - ); - }); - - it("should handle URL with fragment", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret#section", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]#section", - }), - ); - }); - - it("should redact URL-encoded query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api%5Fkey=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api%5Fkey=[REDACTED]", - }), - ); - }); - - it("should handle URL without query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api", - }), - ); - }); - - it("should handle empty query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?", - }), - ); - }); - - it("should redact multiple sensitive parameters in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret1&token=secret2&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", - }), - ); - }); - - it("should redact both credentials and query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/api?token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should use fast path for URLs without sensitive keywords", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - }), - ); - }); - - it("should handle query parameter without value", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?flag&token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?flag&token=[REDACTED]", - }), - ); - }); - - it("should handle URL with multiple @ symbols in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user@example.com:pass@host.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@host.com/api", - }), - ); - }); - - it("should handle URL with @ in query parameter but not in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?email=user@example.com", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?email=user@example.com", - }), - ); - }); - - it("should handle URL with both credentials and @ in path", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/users/@username", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/users/@username", - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts deleted file mode 100644 index d22661367f4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/requestWithRetries.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -import type { Mock, MockInstance } from "vitest"; -import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; - -describe("requestWithRetries", () => { - let mockFetch: Mock; - let originalMathRandom: typeof Math.random; - let setTimeoutSpy: MockInstance; - - beforeEach(() => { - mockFetch = vi.fn(); - originalMathRandom = Math.random; - - Math.random = vi.fn(() => 0.5); - - vi.useFakeTimers({ - toFake: [ - "setTimeout", - "clearTimeout", - "setInterval", - "clearInterval", - "setImmediate", - "clearImmediate", - "Date", - "performance", - "requestAnimationFrame", - "cancelAnimationFrame", - "requestIdleCallback", - "cancelIdleCallback", - ], - }); - }); - - afterEach(() => { - Math.random = originalMathRandom; - vi.clearAllMocks(); - vi.clearAllTimers(); - }); - - it("should retry on retryable status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const retryableStatuses = [408, 429, 500, 502]; - let callCount = 0; - - mockFetch.mockImplementation(async () => { - if (callCount < retryableStatuses.length) { - return new Response("", { status: retryableStatuses[callCount++] }); - } - return new Response("", { status: 200 }); - }); - - const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); - expect(response.status).toBe(200); - }); - - it("should respect maxRetries limit", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const maxRetries = 2; - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - expect(response.status).toBe(500); - }); - - it("should not retry on success status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const successStatuses = [200, 201, 202]; - - for (const status of successStatuses) { - mockFetch.mockReset(); - setTimeoutSpy.mockClear(); - mockFetch.mockResolvedValueOnce(new Response("", { status })); - - const responsePromise = requestWithRetries(() => mockFetch(), 3); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(1); - expect(setTimeoutSpy).not.toHaveBeenCalled(); - } - }); - - interface RetryHeaderTestCase { - description: string; - headerName: string; - headerValue: string | (() => string); - expectedDelayMin: number; - expectedDelayMax: number; - } - - const retryHeaderTests: RetryHeaderTestCase[] = [ - { - description: "should respect retry-after header with seconds value", - headerName: "retry-after", - headerValue: "5", - expectedDelayMin: 4000, - expectedDelayMax: 6000, - }, - { - description: "should respect retry-after header with HTTP date value", - headerName: "retry-after", - headerValue: () => new Date(Date.now() + 3000).toUTCString(), - expectedDelayMin: 2000, - expectedDelayMax: 4000, - }, - { - description: "should respect x-ratelimit-reset header", - headerName: "x-ratelimit-reset", - headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), - expectedDelayMin: 3000, - expectedDelayMax: 6000, - }, - ]; - - retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { - it(description, async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const value = typeof headerValue === "function" ? headerValue() : headerValue; - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ [headerName]: value }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(expectedDelayMin); - expect(actualDelay).toBeLessThan(expectedDelayMax); - expect(response.status).toBe(200); - }); - }); - - it("should apply correct exponential backoff with jitter", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - const maxRetries = 3; - const expectedDelays = [1000, 2000, 4000]; - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); - - expectedDelays.forEach((delay, index) => { - expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); - }); - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - }); - - it("should handle concurrent retries independently", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 200 })) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const promise1 = requestWithRetries(() => mockFetch(), 1); - const promise2 = requestWithRetries(() => mockFetch(), 1); - - await vi.runAllTimersAsync(); - const [response1, response2] = await Promise.all([promise1, promise2]); - - expect(response1.status).toBe(200); - expect(response2.status).toBe(200); - }); - - it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); - expect(response.status).toBe(200); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts deleted file mode 100644 index d7b6d1e63caa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/signals.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; - -describe("Test getTimeoutSignal", () => { - beforeEach(() => { - vi.useFakeTimers(); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - it("should return an object with signal and abortId", () => { - const { signal, abortId } = getTimeoutSignal(1000); - - expect(signal).toBeDefined(); - expect(abortId).toBeDefined(); - expect(signal).toBeInstanceOf(AbortSignal); - expect(signal.aborted).toBe(false); - }); - - it("should create a signal that aborts after the specified timeout", () => { - const timeoutMs = 5000; - const { signal } = getTimeoutSignal(timeoutMs); - - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(timeoutMs - 1); - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(1); - expect(signal.aborted).toBe(true); - }); -}); - -describe("Test anySignal", () => { - it("should return an AbortSignal", () => { - const signal = anySignal(new AbortController().signal); - expect(signal).toBeInstanceOf(AbortSignal); - }); - - it("should abort when any of the input signals is aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal(controller1.signal, controller2.signal); - - expect(signal.aborted).toBe(false); - controller1.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should handle an array of signals", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal([controller1.signal, controller2.signal]); - - expect(signal.aborted).toBe(false); - controller2.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should abort immediately if one of the input signals is already aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - controller1.abort(); - - const signal = anySignal(controller1.signal, controller2.signal); - expect(signal.aborted).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt deleted file mode 100644 index c66d471e359c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/fetcher/test-file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts deleted file mode 100644 index 2e0b5fe5040c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/logging/logger.test.ts +++ /dev/null @@ -1,454 +0,0 @@ -import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -describe("Logger", () => { - describe("LogLevel", () => { - it("should have correct log levels", () => { - expect(LogLevel.Debug).toBe("debug"); - expect(LogLevel.Info).toBe("info"); - expect(LogLevel.Warn).toBe("warn"); - expect(LogLevel.Error).toBe("error"); - }); - }); - - describe("ConsoleLogger", () => { - let consoleLogger: ConsoleLogger; - let consoleSpy: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - consoleLogger = new ConsoleLogger(); - consoleSpy = { - debug: vi.spyOn(console, "debug").mockImplementation(() => {}), - info: vi.spyOn(console, "info").mockImplementation(() => {}), - warn: vi.spyOn(console, "warn").mockImplementation(() => {}), - error: vi.spyOn(console, "error").mockImplementation(() => {}), - }; - }); - - afterEach(() => { - consoleSpy.debug.mockRestore(); - consoleSpy.info.mockRestore(); - consoleSpy.warn.mockRestore(); - consoleSpy.error.mockRestore(); - }); - - it("should log debug messages", () => { - consoleLogger.debug("debug message", { data: "test" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); - }); - - it("should log info messages", () => { - consoleLogger.info("info message", { data: "test" }); - expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); - }); - - it("should log warn messages", () => { - consoleLogger.warn("warn message", { data: "test" }); - expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); - }); - - it("should log error messages", () => { - consoleLogger.error("error message", { data: "test" }); - expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); - }); - - it("should handle multiple arguments", () => { - consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); - }); - }); - - describe("Logger with level filtering", () => { - let mockLogger: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - mockLogger = createMockLogger(); - }); - - describe("Debug level", () => { - it("should log all levels when set to debug", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).toHaveBeenCalledWith("debug"); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(true); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Info level", () => { - it("should log info, warn, and error when set to info", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Warn level", () => { - it("should log warn and error when set to warn", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Error level", () => { - it("should only log error when set to error", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Silent mode", () => { - it("should not log anything when silent is true", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should report all level checks as false when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(false); - }); - }); - - describe("shouldLog", () => { - it("should correctly determine if level should be logged", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(true); - expect(logger.shouldLog(LogLevel.Warn)).toBe(true); - expect(logger.shouldLog(LogLevel.Error)).toBe(true); - }); - - it("should return false for all levels when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - expect(logger.shouldLog(LogLevel.Warn)).toBe(false); - expect(logger.shouldLog(LogLevel.Error)).toBe(false); - }); - }); - - describe("Multiple arguments", () => { - it("should pass multiple arguments to logger", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message", "arg1", { key: "value" }, 123); - expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); - }); - }); - }); - - describe("createLogger", () => { - it("should return default logger when no config provided", () => { - const logger = createLogger(); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should return same logger instance when Logger is passed", () => { - const customLogger = new Logger({ - level: LogLevel.Debug, - logger: new ConsoleLogger(), - silent: false, - }); - - const result = createLogger(customLogger); - expect(result).toBe(customLogger); - }); - - it("should create logger with custom config", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger).toBeInstanceOf(Logger); - logger.warn("test"); - expect(mockLogger.warn).toHaveBeenCalledWith("test"); - }); - - it("should use default values for missing config", () => { - const logger = createLogger({}); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should override default level", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("test"); - expect(mockLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should override default silent mode", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - silent: false, - }); - - logger.info("test"); - expect(mockLogger.info).toHaveBeenCalledWith("test"); - }); - - it("should use provided logger implementation", () => { - const customLogger = createMockLogger(); - - const logger = createLogger({ - logger: customLogger, - level: LogLevel.Debug, - silent: false, - }); - - logger.debug("test"); - expect(customLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should default to silent: true", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - level: LogLevel.Debug, - }); - - logger.debug("test"); - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Default logger", () => { - it("should have silent: true by default", () => { - const logger = createLogger(); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - }); - - it("should not log when using default logger", () => { - const logger = createLogger(); - - logger.info("test"); - expect(logger.isInfo()).toBe(false); - }); - }); - - describe("Edge cases", () => { - it("should handle empty message", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug(""); - expect(mockLogger.debug).toHaveBeenCalledWith(""); - }); - - it("should handle no arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message"); - expect(mockLogger.debug).toHaveBeenCalledWith("message"); - }); - - it("should handle complex objects", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - const complexObject = { - nested: { key: "value" }, - array: [1, 2, 3], - fn: () => "test", - }; - - logger.debug("message", complexObject); - expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); - }); - - it("should handle errors as arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - const error = new Error("Test error"); - logger.error("Error occurred", error); - expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts deleted file mode 100644 index 123488f084ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/join.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { join } from "../../../src/core/url/index"; - -describe("join", () => { - interface TestCase { - description: string; - base: string; - segments: string[]; - expected: string; - } - - describe("basic functionality", () => { - const basicTests: TestCase[] = [ - { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, - { - description: "should return empty string for empty base with path", - base: "", - segments: ["path"], - expected: "", - }, - { - description: "should handle single segment", - base: "base", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with trailing slash on base", - base: "base/", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with leading slash", - base: "base", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with both slashes", - base: "base/", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle multiple segments", - base: "base", - segments: ["path1", "path2", "path3"], - expected: "base/path1/path2/path3", - }, - { - description: "should handle multiple segments with slashes", - base: "base/", - segments: ["/path1/", "/path2/", "/path3/"], - expected: "base/path1/path2/path3/", - }, - ]; - - basicTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("URL handling", () => { - const urlTests: TestCase[] = [ - { - description: "should handle absolute URLs", - base: "https://example.com", - segments: ["api", "v1"], - expected: "https://example.com/api/v1", - }, - { - description: "should handle absolute URLs with slashes", - base: "https://example.com/", - segments: ["/api/", "/v1/"], - expected: "https://example.com/api/v1/", - }, - { - description: "should handle absolute URLs with base path", - base: "https://example.com/base", - segments: ["api", "v1"], - expected: "https://example.com/base/api/v1", - }, - { - description: "should preserve URL query parameters", - base: "https://example.com?query=1", - segments: ["api"], - expected: "https://example.com/api?query=1", - }, - { - description: "should preserve URL fragments", - base: "https://example.com#fragment", - segments: ["api"], - expected: "https://example.com/api#fragment", - }, - { - description: "should preserve URL query and fragments", - base: "https://example.com?query=1#fragment", - segments: ["api"], - expected: "https://example.com/api?query=1#fragment", - }, - { - description: "should handle http protocol", - base: "http://example.com", - segments: ["api"], - expected: "http://example.com/api", - }, - { - description: "should handle ftp protocol", - base: "ftp://example.com", - segments: ["files"], - expected: "ftp://example.com/files", - }, - { - description: "should handle ws protocol", - base: "ws://example.com", - segments: ["socket"], - expected: "ws://example.com/socket", - }, - { - description: "should fallback to path joining for malformed URLs", - base: "not-a-url://", - segments: ["path"], - expected: "not-a-url:///path", - }, - ]; - - urlTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("edge cases", () => { - const edgeCaseTests: TestCase[] = [ - { - description: "should handle empty segments", - base: "base", - segments: ["", "path"], - expected: "base/path", - }, - { - description: "should handle null segments", - base: "base", - segments: [null as any, "path"], - expected: "base/path", - }, - { - description: "should handle undefined segments", - base: "base", - segments: [undefined as any, "path"], - expected: "base/path", - }, - { - description: "should handle segments with only single slash", - base: "base", - segments: ["/", "path"], - expected: "base/path", - }, - { - description: "should handle segments with only double slash", - base: "base", - segments: ["//", "path"], - expected: "base/path", - }, - { - description: "should handle base paths with trailing slashes", - base: "base/", - segments: ["path"], - expected: "base/path", - }, - { - description: "should handle complex nested paths", - base: "api/v1/", - segments: ["/users/", "/123/", "/profile"], - expected: "api/v1/users/123/profile", - }, - ]; - - edgeCaseTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("real-world scenarios", () => { - const realWorldTests: TestCase[] = [ - { - description: "should handle API endpoint construction", - base: "https://api.example.com/v1", - segments: ["users", "123", "posts"], - expected: "https://api.example.com/v1/users/123/posts", - }, - { - description: "should handle file path construction", - base: "/var/www", - segments: ["html", "assets", "images"], - expected: "/var/www/html/assets/images", - }, - { - description: "should handle relative path construction", - base: "../parent", - segments: ["child", "grandchild"], - expected: "../parent/child/grandchild", - }, - { - description: "should handle Windows-style paths", - base: "C:\\Users", - segments: ["Documents", "file.txt"], - expected: "C:\\Users/Documents/file.txt", - }, - ]; - - realWorldTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("performance scenarios", () => { - it("should handle many segments efficiently", () => { - const segments = Array(100).fill("segment"); - const result = join("base", ...segments); - expect(result).toBe(`base/${segments.join("/")}`); - }); - - it("should handle long URLs", () => { - const longPath = "a".repeat(1000); - expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); - }); - }); - - describe("trailing slash preservation", () => { - const trailingSlashTests: TestCase[] = [ - { - description: - "should preserve trailing slash on final result when base has trailing slash and no segments", - base: "https://api.example.com/", - segments: [], - expected: "https://api.example.com/", - }, - { - description: "should preserve trailing slash on v1 path", - base: "https://api.example.com/v1/", - segments: [], - expected: "https://api.example.com/v1/", - }, - { - description: "should preserve trailing slash when last segment has trailing slash", - base: "https://api.example.com", - segments: ["users/"], - expected: "https://api.example.com/users/", - }, - { - description: "should preserve trailing slash with relative path", - base: "api/v1", - segments: ["users/"], - expected: "api/v1/users/", - }, - { - description: "should preserve trailing slash with multiple segments", - base: "https://api.example.com", - segments: ["v1", "collections/"], - expected: "https://api.example.com/v1/collections/", - }, - { - description: "should preserve trailing slash with base path", - base: "base", - segments: ["path1", "path2/"], - expected: "base/path1/path2/", - }, - ]; - - trailingSlashTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts deleted file mode 100644 index 42cdffb9e5ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/unit/url/qs.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { toQueryString } from "../../../src/core/url/index"; - -describe("Test qs toQueryString", () => { - interface BasicTestCase { - description: string; - input: any; - expected: string; - } - - describe("Basic functionality", () => { - const basicTests: BasicTestCase[] = [ - { description: "should return empty string for null", input: null, expected: "" }, - { description: "should return empty string for undefined", input: undefined, expected: "" }, - { description: "should return empty string for string primitive", input: "hello", expected: "" }, - { description: "should return empty string for number primitive", input: 42, expected: "" }, - { description: "should return empty string for true boolean", input: true, expected: "" }, - { description: "should return empty string for false boolean", input: false, expected: "" }, - { description: "should handle empty objects", input: {}, expected: "" }, - { - description: "should handle simple key-value pairs", - input: { name: "John", age: 30 }, - expected: "name=John&age=30", - }, - ]; - - basicTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Array handling", () => { - interface ArrayTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const arrayTests: ArrayTestCase[] = [ - { - description: "should handle arrays with indices format (default)", - input: { items: ["a", "b", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", - }, - { - description: "should handle arrays with repeat format", - input: { items: ["a", "b", "c"] }, - options: { arrayFormat: "repeat" }, - expected: "items=a&items=b&items=c", - }, - { - description: "should handle empty arrays", - input: { items: [] }, - expected: "", - }, - { - description: "should handle arrays with mixed types", - input: { mixed: ["string", 42, true, false] }, - expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", - }, - { - description: "should handle arrays with objects", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", - }, - { - description: "should handle arrays with objects in repeat format", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - options: { arrayFormat: "repeat" }, - expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", - }, - ]; - - arrayTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Nested objects", () => { - const nestedTests: BasicTestCase[] = [ - { - description: "should handle nested objects", - input: { user: { name: "John", age: 30 } }, - expected: "user%5Bname%5D=John&user%5Bage%5D=30", - }, - { - description: "should handle deeply nested objects", - input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, - expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle empty nested objects", - input: { user: {} }, - expected: "", - }, - ]; - - nestedTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Encoding", () => { - interface EncodingTestCase { - description: string; - input: any; - options?: { encode?: boolean }; - expected: string; - } - - const encodingTests: EncodingTestCase[] = [ - { - description: "should encode by default", - input: { name: "John Doe", email: "john@example.com" }, - expected: "name=John%20Doe&email=john%40example.com", - }, - { - description: "should not encode when encode is false", - input: { name: "John Doe", email: "john@example.com" }, - options: { encode: false }, - expected: "name=John Doe&email=john@example.com", - }, - { - description: "should encode special characters in keys", - input: { "user name": "John", "email[primary]": "john@example.com" }, - expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", - }, - { - description: "should not encode special characters in keys when encode is false", - input: { "user name": "John", "email[primary]": "john@example.com" }, - options: { encode: false }, - expected: "user name=John&email[primary]=john@example.com", - }, - ]; - - encodingTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Mixed scenarios", () => { - interface MixedTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const mixedTests: MixedTestCase[] = [ - { - description: "should handle complex nested structures", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle complex nested structures with repeat format", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - options: { arrayFormat: "repeat" }, - expected: - "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle arrays with null/undefined values", - input: { items: ["a", null, "c", undefined, "e"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", - }, - { - description: "should handle objects with null/undefined values", - input: { name: "John", age: null, email: undefined, active: true }, - expected: "name=John&age=&active=true", - }, - ]; - - mixedTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Edge cases", () => { - const edgeCaseTests: BasicTestCase[] = [ - { - description: "should handle numeric keys", - input: { "0": "zero", "1": "one" }, - expected: "0=zero&1=one", - }, - { - description: "should handle boolean values in objects", - input: { enabled: true, disabled: false }, - expected: "enabled=true&disabled=false", - }, - { - description: "should handle empty strings", - input: { name: "", description: "test" }, - expected: "name=&description=test", - }, - { - description: "should handle zero values", - input: { count: 0, price: 0.0 }, - expected: "count=0&price=0", - }, - { - description: "should handle arrays with empty strings", - input: { items: ["a", "", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", - }, - ]; - - edgeCaseTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Options combinations", () => { - interface OptionsTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; - expected: string; - } - - const optionsTests: OptionsTestCase[] = [ - { - description: "should respect both arrayFormat and encode options", - input: { items: ["a & b", "c & d"] }, - options: { arrayFormat: "repeat", encode: false }, - expected: "items=a & b&items=c & d", - }, - { - description: "should use default options when none provided", - input: { items: ["a", "b"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b", - }, - { - description: "should merge provided options with defaults", - input: { items: ["a", "b"], name: "John Doe" }, - options: { encode: false }, - expected: "items[0]=a&items[1]=b&name=John Doe", - }, - ]; - - optionsTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts deleted file mode 100644 index 5a3250cc64ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/container.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContainerClient", () => { - test("getAndReturnListOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string", "string"]; - const rawResponseBody = ["string", "string"]; - server - .mockEndpoint() - .post("/container/list-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - expect(response).toEqual(["string", "string"]); - }); - - test("getAndReturnListOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }, { string: "string" }]; - const rawResponseBody = [{ string: "string" }, { string: "string" }]; - server - .mockEndpoint() - .post("/container/list-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfObjects([ - { - string: "string", - }, - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - { - string: "string", - }, - ]); - }); - - test("getAndReturnSetOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string"]; - const rawResponseBody = ["string"]; - server - .mockEndpoint() - .post("/container/set-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfPrimitives(["string"]); - expect(response).toEqual(["string"]); - }); - - test("getAndReturnSetOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }]; - const rawResponseBody = [{ string: "string" }]; - server - .mockEndpoint() - .post("/container/set-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfObjects([ - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - ]); - }); - - test("getAndReturnMapPrimToPrim", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/map-prim-to-prim") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnMapOfPrimToObject", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: { string: "string" } }; - const rawResponseBody = { string: { string: "string" } }; - server - .mockEndpoint() - .post("/container/map-prim-to-object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ - string: { - string: "string", - }, - }); - expect(response).toEqual({ - string: { - string: "string", - }, - }); - }); - - test("getAndReturnOptional", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/opt-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnOptional({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts deleted file mode 100644 index f6336d860bd7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/contentType.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContentTypeClient", () => { - test("postJsonPatchContentType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); - - test("postJsonPatchContentWithCharsetType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts deleted file mode 100644 index 5770be42a097..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/enum.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("EnumClient", () => { - test("getAndReturnEnum", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SUNNY"; - const rawResponseBody = "SUNNY"; - server - .mockEndpoint() - .post("/enum") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); - expect(response).toEqual("SUNNY"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts deleted file mode 100644 index aab4d5b86ec7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/httpMethods.test.ts +++ /dev/null @@ -1,212 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("HttpMethodsClient", () => { - test("testGet", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.httpMethods.testGet("id"); - expect(response).toEqual("string"); - }); - - test("testPost", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/http-methods") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPost({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPut", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .put("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPut("id", { - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPatch", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .patch("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testDelete", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = true; - server - .mockEndpoint() - .delete("/http-methods/id") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testDelete("id"); - expect(response).toEqual(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts deleted file mode 100644 index 8169463c8368..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/object.test.ts +++ /dev/null @@ -1,448 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ObjectClient", () => { - test("getAndReturnWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/object/get-and-return-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("getAndReturnWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/object/get-and-return-with-required-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnWithMapOfMap", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { map: { map: { map: "map" } } }; - const rawResponseBody = { map: { map: { map: "map" } } }; - server - .mockEndpoint() - .post("/object/get-and-return-with-map-of-map") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - map: { - map: "map", - }, - }, - }); - expect(response).toEqual({ - map: { - map: { - map: "map", - }, - }, - }); - }); - - test("getAndReturnNestedWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredFieldAsList", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - ]; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field-list") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - ]); - expect(response).toEqual({ - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts deleted file mode 100644 index be2e7ddd6591..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/params.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ParamsClient", () => { - test("getWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithPath("param"); - expect(response).toEqual("string"); - }); - - test("getWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithInlinePath({ - param: "param", - }); - expect(response).toEqual("string"); - }); - - test("getWithQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithAllowMultipleQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithPathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithPathAndQuery("param", { - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("getWithInlinePathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("modifyWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithPath("param", "string"); - expect(response).toEqual("string"); - }); - - test("modifyWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string", - }); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts deleted file mode 100644 index 7797a100db7b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/primitive.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PrimitiveClient", () => { - test("getAndReturnString", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .post("/primitive/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnString("string"); - expect(response).toEqual("string"); - }); - - test("getAndReturnInt", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1; - const rawResponseBody = 1; - server - .mockEndpoint() - .post("/primitive/integer") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnInt(1); - expect(response).toEqual(1); - }); - - test("getAndReturnLong", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1000000; - const rawResponseBody = 1000000; - server - .mockEndpoint() - .post("/primitive/long") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnLong(1000000); - expect(response).toEqual(1000000); - }); - - test("getAndReturnDouble", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1.1; - const rawResponseBody = 1.1; - server - .mockEndpoint() - .post("/primitive/double") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDouble(1.1); - expect(response).toEqual(1.1); - }); - - test("getAndReturnBool", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = true; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/primitive/boolean") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBool(true); - expect(response).toEqual(true); - }); - - test("getAndReturnDatetime", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2024-01-15T09:30:00Z"; - const rawResponseBody = "2024-01-15T09:30:00Z"; - server - .mockEndpoint() - .post("/primitive/datetime") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDatetime("2024-01-15T09:30:00Z"); - expect(response).toEqual("2024-01-15T09:30:00Z"); - }); - - test("getAndReturnDate", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2023-01-15"; - const rawResponseBody = "2023-01-15"; - server - .mockEndpoint() - .post("/primitive/date") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - expect(response).toEqual("2023-01-15"); - }); - - test("getAndReturnUUID", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - server - .mockEndpoint() - .post("/primitive/uuid") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - }); - - test("getAndReturnBase64", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SGVsbG8gd29ybGQh"; - const rawResponseBody = "SGVsbG8gd29ybGQh"; - server - .mockEndpoint() - .post("/primitive/base64") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - expect(response).toEqual("SGVsbG8gd29ybGQh"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts deleted file mode 100644 index 1481521d77b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/put.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PutClient", () => { - test("add", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - errors: [ - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - ], - }; - server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.put.add({ - id: "id", - }); - expect(response).toEqual({ - errors: [ - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - ], - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts deleted file mode 100644 index 35b1405e89ca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/union.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UnionClient", () => { - test("getAndReturnUnion", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; - const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; - server - .mockEndpoint() - .post("/union") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - expect(response).toEqual({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts deleted file mode 100644 index b450fbeea217..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/endpoints/urls.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UrlsClient", () => { - test("withMixedCase", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.urls.withMixedCase(); - expect(response).toEqual("string"); - }); - - test("noEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/no-ending-slash") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.noEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with-ending-slash/") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withUnderscores", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with_underscores") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withUnderscores(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts deleted file mode 100644 index 74529a1788fd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/inlinedRequests.test.ts +++ /dev/null @@ -1,150 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("InlinedRequestsClient", () => { - test("postWithObjectBodyandResponse (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithObjectBodyandResponse (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts deleted file mode 100644 index 3317cf1a69d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noAuth.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoAuthClient", () => { - test("postWithNoAuth (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.noAuth.postWithNoAuth({ - key: "value", - }); - expect(response).toEqual(true); - }); - - test("postWithNoAuth (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.noAuth.postWithNoAuth({ - key: "value", - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts deleted file mode 100644 index 7aec8c7699f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/noReqBody.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoReqBodyClient", () => { - test("getWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.getWithNoRequestBody(); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.postWithNoRequestBody(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts deleted file mode 100644 index a2295047e422..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tests/wire/reqWithHeaders.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("ReqWithHeadersClient", () => { - test("getWithCustomHeader", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - - server - .mockEndpoint() - .post("/test-headers/custom-header") - .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") - .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .build(); - - const response = await client.reqWithHeaders.getWithCustomHeader({ - "X-TEST-SERVICE-HEADER": "X-TEST-SERVICE-HEADER", - "X-TEST-ENDPOINT-HEADER": "X-TEST-ENDPOINT-HEADER", - body: "string", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json deleted file mode 100644 index d7627675de20..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.base.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "extendedDiagnostics": true, - "strict": true, - "target": "ES6", - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "dist", - "rootDir": "src", - "baseUrl": "src", - "isolatedModules": true, - "isolatedDeclarations": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json deleted file mode 100644 index 5c11446f5984..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "dist/cjs" - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json deleted file mode 100644 index 6ce909748b2c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.esm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "esnext", - "outDir": "dist/esm", - "verbatimModuleSyntax": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json deleted file mode 100644 index d77fdf00d259..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.cjs.json" -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts deleted file mode 100644 index ba2ec4f9d45a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-none/vitest.config.mts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from "vitest/config"; -export default defineConfig({ - test: { - projects: [ - { - test: { - globals: true, - name: "unit", - environment: "node", - root: "./tests", - include: ["**/*.test.{js,ts,jsx,tsx}"], - exclude: ["wire/**"], - setupFiles: ["./setup.ts"], - }, - }, - { - test: { - globals: true, - name: "wire", - environment: "node", - root: "./tests/wire", - setupFiles: ["../setup.ts", "../mock-server/setup.ts"], - }, - }, - ], - passWithNoTests: true, - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json deleted file mode 100644 index 4a881bff00a8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "cliVersion": "DUMMY", - "generatorName": "fernapi/fern-typescript-sdk", - "generatorVersion": "latest", - "generatorConfig": { - "serializationFormat": "zod" - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml deleted file mode 100644 index 836106996595..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: ci - -on: [push] - -jobs: - compile: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Compile - run: pnpm build - - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Test - run: pnpm test - - publish: - needs: [ compile, test ] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build - run: pnpm build - - - name: Publish to npm - run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - publish() { # use latest npm to ensure OIDC support - npx -y npm@latest publish "$@" - } - if [[ ${GITHUB_REF} == *alpha* ]]; then - publish --access public --tag alpha - elif [[ ${GITHUB_REF} == *beta* ]]; then - publish --access public --tag beta - else - publish --access public - fi - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore deleted file mode 100644 index 72271e049c02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.DS_Store -/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md deleted file mode 100644 index fe5bc2f77e0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md +++ /dev/null @@ -1,133 +0,0 @@ -# Contributing - -Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. - -## Getting Started - -### Prerequisites - -- Node.js 20 or higher -- pnpm package manager - -### Installation - -Install the project dependencies: - -```bash -pnpm install -``` - -### Building - -Build the project: - -```bash -pnpm build -``` - -### Testing - -Run the test suite: - -```bash -pnpm test -``` - -Run specific test types: -- `pnpm test:unit` - Run unit tests -- `pnpm test:wire` - Run wire/integration tests - -### Linting and Formatting - -Check code style: - -```bash -pnpm run lint -pnpm run format:check -``` - -Fix code style issues: - -```bash -pnpm run lint:fix -pnpm run format:fix -``` - -Or use the combined check command: - -```bash -pnpm run check:fix -``` - -## About Generated Code - -**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. - -### Generated Files - -The following directories contain generated code: -- `src/api/` - API client classes and types -- `src/serialization/` - Serialization/deserialization logic -- Most TypeScript files in `src/` - -### How to Customize - -If you need to customize the SDK, you have two options: - -#### Option 1: Use `.fernignore` - -For custom code that should persist across SDK regenerations: - -1. Create a `.fernignore` file in the project root -2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) -3. Add your custom code to those files - -Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. - -For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). - -#### Option 2: Contribute to the Generator - -If you want to change how code is generated for all users of this SDK: - -1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) -2. Generator code is located at `generators/typescript/sdk/` -3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) -4. Submit a pull request with your changes to the generator - -This approach is best for: -- Bug fixes in generated code -- New features that would benefit all users -- Improvements to code generation patterns - -## Making Changes - -### Workflow - -1. Create a new branch for your changes -2. Make your modifications -3. Run tests to ensure nothing breaks: `pnpm test` -4. Run linting and formatting: `pnpm run check:fix` -5. Build the project: `pnpm build` -6. Commit your changes with a clear commit message -7. Push your branch and create a pull request - -### Commit Messages - -Write clear, descriptive commit messages that explain what changed and why. - -### Code Style - -This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. - -## Questions or Issues? - -If you have questions or run into issues: - -1. Check the [Fern documentation](https://buildwithfern.com) -2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) -3. Open a new issue if your question hasn't been addressed - -## License - -By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/README.md b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md deleted file mode 100644 index 140b1fb505f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/README.md +++ /dev/null @@ -1,241 +0,0 @@ -# Seed TypeScript Library - -[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) -[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) - -The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. - -## Installation - -```sh -npm i -s @fern/exhaustive -``` - -## Reference - -A full reference for this library is available [here](./reference.md). - -## Usage - -Instantiate and use the client with the following: - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); -``` - -## Request And Response Types - -The SDK exports all request and response types as TypeScript interfaces. Simply import them with the -following namespace: - -```typescript -import { SeedExhaustive } from "@fern/exhaustive"; - -const request: SeedExhaustive.GetWithInlinePath = { - ... -}; -``` - -## Exception Handling - -When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error -will be thrown. - -```typescript -import { SeedExhaustiveError } from "@fern/exhaustive"; - -try { - await client.endpoints.container.getAndReturnListOfPrimitives(...); -} catch (err) { - if (err instanceof SeedExhaustiveError) { - console.log(err.statusCode); - console.log(err.message); - console.log(err.body); - console.log(err.rawResponse); - } -} -``` - -## Advanced - -### Additional Headers - -If you would like to send additional headers as part of the request, use the `headers` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - headers: { - 'X-Custom-Header': 'custom value' - } -}); -``` - -### Additional Query String Parameters - -If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - queryParams: { - 'customQueryParamKey': 'custom query param value' - } -}); -``` - -### Retries - -The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long -as the request is deemed retryable and the number of retry attempts has not grown larger than the configured -retry limit (default: 2). - -A request is deemed retryable when any of the following HTTP status codes is returned: - -- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) -- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) -- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) - -Use the `maxRetries` request option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - maxRetries: 0 // override maxRetries at the request level -}); -``` - -### Timeouts - -The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - timeoutInSeconds: 30 // override timeout to 30s -}); -``` - -### Aborting Requests - -The SDK allows users to abort requests at any point by passing in an abort signal. - -```typescript -const controller = new AbortController(); -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - abortSignal: controller.signal -}); -controller.abort(); // aborts the request -``` - -### Access Raw Response Data - -The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. -The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. - -```typescript -const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); - -console.log(data); -console.log(rawResponse.headers['X-My-Header']); -``` - -### Logging - -The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. - -```typescript -import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - logging: { - level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info - logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger - silent: false, // defaults to true, set to false to enable logging - } -}); -``` -The `logging` object can have the following properties: -- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. -- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. -- `silent`: Whether to silence the logger. Defaults to `true`. - -The `level` property can be one of the following values: -- `logging.LogLevel.Debug` -- `logging.LogLevel.Info` -- `logging.LogLevel.Warn` -- `logging.LogLevel.Error` - -To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. - -
-Custom logger examples - -Here's an example using the popular `winston` logging library. -```ts -import winston from 'winston'; - -const winstonLogger = winston.createLogger({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => winstonLogger.debug(msg, ...args), - info: (msg, ...args) => winstonLogger.info(msg, ...args), - warn: (msg, ...args) => winstonLogger.warn(msg, ...args), - error: (msg, ...args) => winstonLogger.error(msg, ...args), -}; -``` - -Here's an example using the popular `pino` logging library. - -```ts -import pino from 'pino'; - -const pinoLogger = pino({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => pinoLogger.debug(args, msg), - info: (msg, ...args) => pinoLogger.info(args, msg), - warn: (msg, ...args) => pinoLogger.warn(args, msg), - error: (msg, ...args) => pinoLogger.error(args, msg), -}; -``` -
- - -### Runtime Compatibility - - -The SDK works in the following runtimes: - - - -- Node.js 18+ -- Vercel -- Cloudflare Workers -- Deno v1.25+ -- Bun 1.0+ -- React Native - -### Customizing Fetch Client - -The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an -unsupported environment, this provides a way for you to break glass and ensure the SDK works. - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - fetcher: // provide your implementation here -}); -``` - -## Contributing - -While we value open-source contributions to this SDK, this library is generated programmatically. -Additions made directly to this library would have to be moved over to our generation code, -otherwise they would be overwritten upon the next generated release. Feel free to open a PR as -a proof of concept, but know that we will not be able to merge it as-is. We suggest opening -an issue first to discuss with us! - -On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json deleted file mode 100644 index a777468e4ae2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", - "root": true, - "vcs": { - "enabled": false - }, - "files": { - "ignoreUnknown": true, - "includes": [ - "**", - "!!dist", - "!!**/dist", - "!!lib", - "!!**/lib", - "!!_tmp_*", - "!!**/_tmp_*", - "!!*.tmp", - "!!**/*.tmp", - "!!.tmp/", - "!!**/.tmp/", - "!!*.log", - "!!**/*.log", - "!!**/.DS_Store", - "!!**/Thumbs.db" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 4, - "lineWidth": 120 - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - }, - "linter": { - "rules": { - "style": { - "useNodejsImportProtocol": "off" - }, - "suspicious": { - "noAssignInExpressions": "warn", - "noUselessEscapeInString": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noThenProperty": "warn", - "useIterableCallbackReturn": "warn", - "noShadowRestrictedNames": "warn", - "noTsIgnore": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noConfusingVoidType": { - "level": "warn", - "fix": "none", - "options": {} - } - } - } - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/package.json b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json deleted file mode 100644 index 20397bfc4323..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "@fern/exhaustive", - "version": "0.0.1", - "private": false, - "repository": "github:exhaustive/fern", - "type": "commonjs", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.mjs", - "types": "./dist/cjs/index.d.ts", - "exports": { - ".": { - "types": "./dist/cjs/index.d.ts", - "import": { - "types": "./dist/esm/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - }, - "default": "./dist/cjs/index.js" - }, - "./serialization": { - "types": "./dist/cjs/serialization/index.d.ts", - "import": { - "types": "./dist/esm/serialization/index.d.mts", - "default": "./dist/esm/serialization/index.mjs" - }, - "require": { - "types": "./dist/cjs/serialization/index.d.ts", - "default": "./dist/cjs/serialization/index.js" - }, - "default": "./dist/cjs/serialization/index.js" - }, - "./package.json": "./package.json" - }, - "files": [ - "dist", - "reference.md", - "README.md", - "LICENSE" - ], - "scripts": { - "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "build": "pnpm build:cjs && pnpm build:esm", - "build:cjs": "tsc --project ./tsconfig.cjs.json", - "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", - "test": "vitest", - "test:unit": "vitest --project unit", - "test:wire": "vitest --project wire" - }, - "dependencies": { - "zod": "^3.23.0" - }, - "devDependencies": { - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", - "vitest": "^3.2.4", - "msw": "2.11.2", - "@types/node": "^18.19.70", - "typescript": "~5.7.2", - "@biomejs/biome": "2.3.1" - }, - "browser": { - "fs": false, - "os": false, - "path": false, - "stream": false - }, - "packageManager": "pnpm@10.20.0", - "engines": { - "node": ">=18.0.0" - }, - "sideEffects": false -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml deleted file mode 100644 index 6e4c395107df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml +++ /dev/null @@ -1 +0,0 @@ -packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md deleted file mode 100644 index b571afcab9fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md +++ /dev/null @@ -1,2761 +0,0 @@ -# Reference -## Endpoints Container -
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfObjects([{ - string: "string" - }, { - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Set` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfObjects([{ - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapPrimToPrim({ - "string": "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapOfPrimToObject({ - "string": { - string: "string" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnOptional({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints ContentType -
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Enum -
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.enum.getAndReturnEnum("SUNNY"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.WeatherReport` - -
-
- -
-
- -**requestOptions:** `EnumClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints HttpMethods -
client.endpoints.httpMethods.testGet(id) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testGet("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPost({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPut("id", { - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testDelete(id) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testDelete("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Object -
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - "map": { - "map": "map" - } - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithMapOfMap` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**string:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }, { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Params -
client.endpoints.params.getWithPath(param) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPath("param"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePath({ - param: "param" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with multiple of same query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPathAndQuery("param", { - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithPath(param, { ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithPath("param", "string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Primitive -
client.endpoints.primitive.getAndReturnString({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnString("string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnInt(1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnLong(1000000); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDouble(1.1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBool(true); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `boolean` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Date` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Put -
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.put.add({ - id: "id" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.PutRequest` - -
-
- -
-
- -**requestOptions:** `PutClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Union -
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.Animal` - -
-
- -
-
- -**requestOptions:** `UnionClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Urls -
client.endpoints.urls.withMixedCase() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withMixedCase(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.noEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.noEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withUnderscores() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withUnderscores(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## InlinedRequests -
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 📝 Description - -
-
- -
-
- -POST with custom object in request body, response is an object -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.PostWithObjectBody` - -
-
- -
-
- -**requestOptions:** `InlinedRequestsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoAuth -
client.noAuth.postWithNoAuth({ ...params }) -> boolean -
-
- -#### 📝 Description - -
-
- -
-
- -POST request with no auth -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noAuth.postWithNoAuth({ - "key": "value" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `unknown` - -
-
- -
-
- -**requestOptions:** `NoAuthClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoReqBody -
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.getWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.noReqBody.postWithNoRequestBody() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.postWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## ReqWithHeaders -
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ReqWithHeaders` - -
-
- -
-
- -**requestOptions:** `ReqWithHeadersClient.RequestOptions` - -
-
-
-
- - -
-
-
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js deleted file mode 100644 index dc1df1cbbacb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs").promises; -const path = require("path"); - -const extensionMap = { - ".js": ".mjs", - ".d.ts": ".d.mts", -}; -const oldExtensions = Object.keys(extensionMap); - -async function findFiles(rootPath) { - const files = []; - - async function scan(directory) { - const entries = await fs.readdir(directory, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(directory, entry.name); - - if (entry.isDirectory()) { - if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { - await scan(fullPath); - } - } else if (entry.isFile()) { - if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { - files.push(fullPath); - } - } - } - } - - await scan(rootPath); - return files; -} - -async function updateFiles(files) { - const updatedFiles = []; - for (const file of files) { - const updated = await updateFileContents(file); - updatedFiles.push(updated); - } - - console.log(`Updated imports in ${updatedFiles.length} files.`); -} - -async function updateFileContents(file) { - const content = await fs.readFile(file, "utf8"); - - let newContent = content; - // Update each extension type defined in the map - for (const [oldExt, newExt] of Object.entries(extensionMap)) { - // Handle static imports/exports - const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); - newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); - - // Handle dynamic imports (yield import, await import, regular import()) - const dynamicRegex = new RegExp( - `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, - "g", - ); - newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); - } - - if (content !== newContent) { - await fs.writeFile(file, newContent, "utf8"); - return true; - } - return false; -} - -async function renameFiles(files) { - let counter = 0; - for (const file of files) { - const ext = oldExtensions.find((ext) => file.endsWith(ext)); - const newExt = extensionMap[ext]; - - if (newExt) { - const newPath = file.slice(0, -ext.length) + newExt; - await fs.rename(file, newPath); - counter++; - } - } - - console.log(`Renamed ${counter} files.`); -} - -async function main() { - try { - const targetDir = process.argv[2]; - if (!targetDir) { - console.error("Please provide a target directory"); - process.exit(1); - } - - const targetPath = path.resolve(targetDir); - const targetStats = await fs.stat(targetPath); - - if (!targetStats.isDirectory()) { - console.error("The provided path is not a directory"); - process.exit(1); - } - - console.log(`Scanning directory: ${targetDir}`); - - const files = await findFiles(targetDir); - - if (files.length === 0) { - console.log("No matching files found."); - process.exit(0); - } - - console.log(`Found ${files.length} files.`); - await updateFiles(files); - await renameFiles(files); - console.log("\nDone!"); - } catch (error) { - console.error("An error occurred:", error.message); - process.exit(1); - } -} - -main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json deleted file mode 100644 index 875b76c4bb57..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "endpoints": [ - { - "id": { - "path": "/container/list-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" - } - }, - { - "id": { - "path": "/container/list-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/set-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" - } - }, - { - "id": { - "path": "/container/set-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-prim", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-object", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" - } - }, - { - "id": { - "path": "/container/opt-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/foo/bar", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/foo/baz", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/enum", - "method": "POST", - "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "GET", - "identifier_override": "endpoint_endpoints/http-methods.testGet" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" - } - }, - { - "id": { - "path": "/http-methods", - "method": "POST", - "identifier_override": "endpoint_endpoints/http-methods.testPost" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/http-methods.testPut" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PATCH", - "identifier_override": "endpoint_endpoints/http-methods.testPatch" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "DELETE", - "identifier_override": "endpoint_endpoints/http-methods.testDelete" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-required-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-map-of-map", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field/{string}", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field-list", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/primitive/string", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" - } - }, - { - "id": { - "path": "/primitive/integer", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" - } - }, - { - "id": { - "path": "/primitive/long", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" - } - }, - { - "id": { - "path": "/primitive/double", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" - } - }, - { - "id": { - "path": "/primitive/boolean", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" - } - }, - { - "id": { - "path": "/primitive/datetime", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" - } - }, - { - "id": { - "path": "/primitive/date", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" - } - }, - { - "id": { - "path": "/primitive/uuid", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" - } - }, - { - "id": { - "path": "/primitive/base64", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" - } - }, - { - "id": { - "path": "/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/put.add" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" - } - }, - { - "id": { - "path": "/union", - "method": "POST", - "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" - } - }, - { - "id": { - "path": "/urls/MixedCase", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withMixedCase" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" - } - }, - { - "id": { - "path": "/urls/no-ending-slash", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.noEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with-ending-slash/", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with_underscores", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withUnderscores" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" - } - }, - { - "id": { - "path": "/req-bodies/object", - "method": "POST", - "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/no-auth", - "method": "POST", - "identifier_override": "endpoint_no-auth.postWithNoAuth" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "GET", - "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "POST", - "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/test-headers/custom-header", - "method": "POST", - "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" - } - } - ], - "types": {} -} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts deleted file mode 100644 index f28de2b4c43c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts +++ /dev/null @@ -1,82 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; -import { mergeHeaders } from "./core/headers.js"; -import * as core from "./core/index.js"; - -export interface BaseClientOptions { - environment: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token?: core.Supplier; - /** Additional headers to include in requests. */ - headers?: Record | null | undefined>; - /** The default maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The default number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ - fetch?: typeof fetch; - /** Configure logging for the client. */ - logging?: core.logging.LogConfig | core.logging.Logger; -} - -export interface BaseRequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Additional query string parameters to include in the request. */ - queryParams?: Record; - /** Additional headers to include in the request. */ - headers?: Record | null | undefined>; -} - -export type NormalizedClientOptions = T & { - logging: core.logging.Logger; - authProvider?: core.AuthProvider; -}; - -export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { - authProvider: core.AuthProvider; -}; - -export function normalizeClientOptions(options: T): NormalizedClientOptions { - const headers = mergeHeaders( - { - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "@fern/exhaustive", - "X-Fern-SDK-Version": "0.0.1", - "User-Agent": "@fern/exhaustive/0.0.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - }, - options?.headers, - ); - - return { - ...options, - logging: core.logging.createLogger(options?.logging), - headers, - } as NormalizedClientOptions; -} - -export function normalizeClientOptionsWithAuth( - options: T, -): NormalizedClientOptionsWithAuth { - const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; - const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); - normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); - return normalized; -} - -function withNoOpAuthProvider( - options: NormalizedClientOptions, -): NormalizedClientOptionsWithAuth { - return { - ...options, - authProvider: new core.NoOpAuthProvider(), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts deleted file mode 100644 index d5ca904d9544..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; -import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; -import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; -import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; -import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; -import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; - -export declare namespace SeedExhaustiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class SeedExhaustiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _endpoints: EndpointsClient | undefined; - protected _inlinedRequests: InlinedRequestsClient | undefined; - protected _noAuth: NoAuthClient | undefined; - protected _noReqBody: NoReqBodyClient | undefined; - protected _reqWithHeaders: ReqWithHeadersClient | undefined; - - constructor(options: SeedExhaustiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get endpoints(): EndpointsClient { - return (this._endpoints ??= new EndpointsClient(this._options)); - } - - public get inlinedRequests(): InlinedRequestsClient { - return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); - } - - public get noAuth(): NoAuthClient { - return (this._noAuth ??= new NoAuthClient(this._options)); - } - - public get noReqBody(): NoReqBodyClient { - return (this._noReqBody ??= new NoReqBodyClient(this._options)); - } - - public get reqWithHeaders(): ReqWithHeadersClient { - return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts deleted file mode 100644 index b124def3d861..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts +++ /dev/null @@ -1,76 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { ContainerClient } from "../resources/container/client/Client.js"; -import { ContentTypeClient } from "../resources/contentType/client/Client.js"; -import { EnumClient } from "../resources/enum/client/Client.js"; -import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; -import { ObjectClient } from "../resources/object/client/Client.js"; -import { ParamsClient } from "../resources/params/client/Client.js"; -import { PrimitiveClient } from "../resources/primitive/client/Client.js"; -import { PutClient } from "../resources/put/client/Client.js"; -import { UnionClient } from "../resources/union/client/Client.js"; -import { UrlsClient } from "../resources/urls/client/Client.js"; - -export declare namespace EndpointsClient { - export interface Options extends BaseClientOptions {} -} - -export class EndpointsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _container: ContainerClient | undefined; - protected _contentType: ContentTypeClient | undefined; - protected _enum: EnumClient | undefined; - protected _httpMethods: HttpMethodsClient | undefined; - protected _object: ObjectClient | undefined; - protected _params: ParamsClient | undefined; - protected _primitive: PrimitiveClient | undefined; - protected _put: PutClient | undefined; - protected _union: UnionClient | undefined; - protected _urls: UrlsClient | undefined; - - constructor(options: EndpointsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get container(): ContainerClient { - return (this._container ??= new ContainerClient(this._options)); - } - - public get contentType(): ContentTypeClient { - return (this._contentType ??= new ContentTypeClient(this._options)); - } - - public get enum(): EnumClient { - return (this._enum ??= new EnumClient(this._options)); - } - - public get httpMethods(): HttpMethodsClient { - return (this._httpMethods ??= new HttpMethodsClient(this._options)); - } - - public get object(): ObjectClient { - return (this._object ??= new ObjectClient(this._options)); - } - - public get params(): ParamsClient { - return (this._params ??= new ParamsClient(this._options)); - } - - public get primitive(): PrimitiveClient { - return (this._primitive ??= new PrimitiveClient(this._options)); - } - - public get put(): PutClient { - return (this._put ??= new PutClient(this._options)); - } - - public get union(): UnionClient { - return (this._union ??= new UnionClient(this._options)); - } - - public get urls(): UrlsClient { - return (this._urls ??= new UrlsClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts deleted file mode 100644 index 9eb1192dcc32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts deleted file mode 100644 index 65bf08dc772d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts +++ /dev/null @@ -1,477 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContainerClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContainerClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContainerClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) - */ - public getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response._schema.parse( - _response.body, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/list-of-primitives", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfObjects([{ - * string: "string" - * }, { - * string: "string" - * }]) - */ - public getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); - } - - private async __getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfObjects.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfObjects.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); - } - - /** - * @param {Set} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) - */ - public getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response._schema.parse( - _response.body, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfObjects([{ - * string: "string" - * }]) - */ - public getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); - } - - private async __getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfObjects.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapPrimToPrim({ - * "string": "string" - * }) - */ - public getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); - } - - private async __getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-prim", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapOfPrimToObject({ - * "string": { - * string: "string" - * } - * }) - */ - public getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); - } - - private async __getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response._schema.parse( - _response.body, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/map-prim-to-object", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnOptional({ - * string: "string" - * }) - */ - public getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); - } - - private async __getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/opt-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: - request != null - ? serializers.endpoints.container.getAndReturnOptional.Request.json(request) - : undefined, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnOptional.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts deleted file mode 100644 index 920acc7a8a7e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts +++ /dev/null @@ -1,172 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContentTypeClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContentTypeClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContentTypeClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); - } - - private async __postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/bar", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__postJsonPatchContentWithCharsetType(request, requestOptions), - ); - } - - private async __postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/baz", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json; charset=utf-8", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts deleted file mode 100644 index befd4eb2fe7b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts +++ /dev/null @@ -1,84 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace EnumClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class EnumClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: EnumClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.WeatherReport} request - * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.enum.getAndReturnEnum("SUNNY") - */ - public getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); - } - - private async __getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/enum", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.WeatherReport.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.WeatherReport._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts deleted file mode 100644 index 26cd0aef2380..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts +++ /dev/null @@ -1,341 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace HttpMethodsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class HttpMethodsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: HttpMethodsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testGet("id") - */ - public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); - } - - private async __testGet( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testGet.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPost({ - * string: "string" - * }) - */ - public testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); - } - - private async __testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/http-methods", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPut("id", { - * string: "string" - * }) - */ - public testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); - } - - private async __testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPatch("id", { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); - } - - private async __testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PATCH", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testDelete("id") - */ - public testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); - } - - private async __testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "DELETE", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testDelete.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts deleted file mode 100644 index 6046843b5e42..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * as container from "./container/index.js"; -export * as contentType from "./contentType/index.js"; -export * as enum_ from "./enum/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * from "./params/client/requests/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * from "./put/client/requests/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as union from "./union/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts deleted file mode 100644 index 977107bd4917..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts +++ /dev/null @@ -1,523 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ObjectClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ObjectClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ObjectClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithOptionalField({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); - } - - private async __getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-optional-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithRequiredField({ - * string: "string" - * }) - */ - public getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); - } - - private async __getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-required-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithRequiredField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-required-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithMapOfMap} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithMapOfMap({ - * map: { - * "map": { - * "map": "map" - * } - * } - * }) - */ - public getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); - } - - private async __getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-map-of-map", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithMapOfMap.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithMapOfMap._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-map-of-map", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithOptionalField({ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithOptionalField(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithOptionalField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-optional-field", - ); - } - - /** - * @param {string} string - * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithRequiredField.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field/{string}", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }, { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }]) - */ - public getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-required-field-list", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field-list", - ); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts deleted file mode 100644 index 3a81c10c657f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts +++ /dev/null @@ -1,535 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ParamsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ParamsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ParamsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * GET with path param - * - * @param {string} param - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPath("param") - */ - public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); - } - - private async __getWithPath( - param: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithPath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with path param - * - * @param {SeedExhaustive.endpoints.GetWithInlinePath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePath({ - * param: "param" - * }) - */ - public getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); - } - - private async __getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithInlinePath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with query param - * - * @param {SeedExhaustive.endpoints.GetWithQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); - } - - private async __getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - _queryParams.number = number_.toString(); - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with multiple of same query param - * - * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithAllowMultipleQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); - } - - private async __getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - if (Array.isArray(query)) { - _queryParams.query = query.map((item) => item); - } else { - _queryParams.query = query; - } - - if (Array.isArray(number_)) { - _queryParams.number = number_.map((item) => item.toString()); - } else { - _queryParams.number = number_.toString(); - } - - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with path and query params - * - * @param {string} param - * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPathAndQuery("param", { - * query: "query" - * }) - */ - public getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); - } - - private async __getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * GET with path and query params - * - * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePathAndQuery({ - * param: "param", - * query: "query" - * }) - */ - public getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); - } - - private async __getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * PUT to update with path param - * - * @param {string} param - * @param {string} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithPath("param", "string") - */ - public modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); - } - - private async __modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithPath.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithPath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } - - /** - * PUT to update with path param - * - * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithInlinePath({ - * param: "param", - * body: "string" - * }) - */ - public modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); - } - - private async __modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithInlinePath.Request.json(_body), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithInlinePath.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts deleted file mode 100644 index 473165eb1638..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param" - * } - */ -export interface GetWithInlinePath { - param: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts deleted file mode 100644 index 9c674a852dce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * query: "query" - * } - */ -export interface GetWithInlinePathAndQuery { - param: string; - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts deleted file mode 100644 index baca4fafbe62..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithMultipleQuery { - query: string | string[]; - number: number | number[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts deleted file mode 100644 index c3f0018a7874..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query" - * } - */ -export interface GetWithPathAndQuery { - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts deleted file mode 100644 index 7ad48dee4508..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithQuery { - query: string; - number: number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts deleted file mode 100644 index f3f91a06e3f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * body: "string" - * } - */ -export interface ModifyResourceAtInlinedPath { - param: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts deleted file mode 100644 index b059d3702a32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { GetWithInlinePath } from "./GetWithInlinePath.js"; -export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; -export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; -export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; -export type { GetWithQuery } from "./GetWithQuery.js"; -export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts deleted file mode 100644 index 60ef815dc211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts +++ /dev/null @@ -1,563 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace PrimitiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PrimitiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PrimitiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnString("string") - */ - public getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); - } - - private async __getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/string", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnString.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnString.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnInt(1) - */ - public getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); - } - - private async __getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/integer", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnInt.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnInt.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnLong(1000000) - */ - public getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); - } - - private async __getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/long", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnLong.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnLong.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDouble(1.1) - */ - public getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); - } - - private async __getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/double", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDouble.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDouble.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); - } - - /** - * @param {boolean} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBool(true) - */ - public getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); - } - - private async __getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/boolean", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBool.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBool.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); - } - - /** - * @param {Date} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) - */ - public getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); - } - - private async __getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/datetime", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDatetime.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDatetime.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDate("2023-01-15") - */ - public getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); - } - - private async __getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/date", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDate.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDate.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") - */ - public getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); - } - - private async __getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/uuid", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnUuid.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnUuid.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") - */ - public getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); - } - - private async __getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/base64", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBase64.Request.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBase64.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts deleted file mode 100644 index 6a89a9bc090e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts +++ /dev/null @@ -1,84 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace PutClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PutClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PutClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.endpoints.PutRequest} request - * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.put.add({ - * id: "id" - * }) - */ - public add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); - } - - private async __add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): Promise> { - const { id } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.PutResponse._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts deleted file mode 100644 index 2beba9f087cc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * id: "id" - * } - */ -export interface PutRequest { - id: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts deleted file mode 100644 index dba0eda4bbee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts deleted file mode 100644 index d9adb1af9a93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index a197fec87887..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCategory = { - ApiError: "API_ERROR", - AuthenticationError: "AUTHENTICATION_ERROR", - InvalidRequestError: "INVALID_REQUEST_ERROR", -} as const; -export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 3943226222d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCode = { - InternalServerError: "INTERNAL_SERVER_ERROR", - Unauthorized: "UNAUTHORIZED", - Forbidden: "FORBIDDEN", - BadRequest: "BAD_REQUEST", - Conflict: "CONFLICT", - Gone: "GONE", - UnprocessableEntity: "UNPROCESSABLE_ENTITY", - NotImplemented: "NOT_IMPLEMENTED", - BadGateway: "BAD_GATEWAY", - ServiceUnavailable: "SERVICE_UNAVAILABLE", - Unknown: "Unknown", -} as const; -export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 9cf9f495a09a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface Error_ { - category: SeedExhaustive.endpoints.ErrorCategory; - code: SeedExhaustive.endpoints.ErrorCode; - detail?: string; - field?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 628b46ba7298..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface PutResponse { - errors?: SeedExhaustive.endpoints.Error_[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts deleted file mode 100644 index 95f732c131d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts +++ /dev/null @@ -1,85 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace UnionClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UnionClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UnionClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.Animal} request - * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.union.getAndReturnUnion({ - * animal: "dog", - * name: "name", - * likesToWoof: true - * }) - */ - public getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); - } - - private async __getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/union", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.Animal.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: serializers.types.Animal._schema.parse(_response.body), rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts deleted file mode 100644 index c9401e289700..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts +++ /dev/null @@ -1,223 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace UrlsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UrlsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UrlsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withMixedCase() - */ - public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); - } - - private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/MixedCase", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withMixedCase.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.noEndingSlash() - */ - public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); - } - - private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/no-ending-slash", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.noEndingSlash.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withEndingSlash() - */ - public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); - } - - private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with-ending-slash/", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withEndingSlash.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withUnderscores() - */ - public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); - } - - private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with_underscores", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withUnderscores.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts deleted file mode 100644 index 6c0020d2b75a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../core/index.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export class BadRequestBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { - super({ - message: "BadRequestBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts deleted file mode 100644 index 61778bda5417..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index 6ad426742488..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface BadObjectRequestInfo { - message: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts deleted file mode 100644 index 3ca611c9fb54..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * from "./generalErrors/errors/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * from "./reqWithHeaders/client/requests/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts deleted file mode 100644 index dcf128fe3b72..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts +++ /dev/null @@ -1,111 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace InlinedRequestsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class InlinedRequestsClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: InlinedRequestsClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST with custom object in request body, response is an object - * - * @param {SeedExhaustive.PostWithObjectBody} request - * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.inlinedRequests.postWithObjectBodyandResponse({ - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); - } - - private async __postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/req-bodies/object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.PostWithObjectBody.json(request), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo._schema.parse(_response.error.body), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index 15d3f75bc67d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../index.js"; - -/** - * @example - * { - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * } - */ -export interface PostWithObjectBody { - string: string; - integer: number; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index 104f84256770..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts deleted file mode 100644 index 282d68aa3b53..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoAuthClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoAuthClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: NoAuthClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST request with no auth - * - * @param {unknown} request - * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.noAuth.postWithNoAuth({ - * "key": "value" - * }) - */ - public postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); - } - - private async __postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-auth", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noAuth.postWithNoAuth.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo._schema.parse(_response.error.body), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts deleted file mode 100644 index 6eea09ec1f67..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts +++ /dev/null @@ -1,130 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoReqBodyClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoReqBodyClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: NoReqBodyClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.getWithNoRequestBody() - */ - public getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); - } - - private async __getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.postWithNoRequestBody() - */ - public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); - } - - private async __postWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "POST", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noReqBody.postWithNoRequestBody.Response._schema.parse(_response.body), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts deleted file mode 100644 index 5cf55b3b4c66..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts +++ /dev/null @@ -1,90 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace ReqWithHeadersClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ReqWithHeadersClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ReqWithHeadersClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.ReqWithHeaders} request - * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.reqWithHeaders.getWithCustomHeader({ - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * }) - */ - public getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); - } - - private async __getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): Promise> { - const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - mergeOnlyDefinedHeaders({ - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - }), - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/test-headers/custom-header", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.reqWithHeaders.getWithCustomHeader.Request.json(_body), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts deleted file mode 100644 index b7fce3790bf5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * } - */ -export interface ReqWithHeaders { - xTestServiceHeader: string; - xTestEndpointHeader: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts deleted file mode 100644 index 5419b56cd667..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index ed458c66ba3c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,66 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithDocs { - /** - * Characters that could lead to broken generated SDKs: - * - * Markdown Escapes: - * - \_: Escaped underscore (e.g., FOO\_BAR) - * - \*: Escaped asterisk - * - * JSDoc (JavaScript/TypeScript): - * - @: Used for JSDoc tags - * - {: }: Used for type definitions - * - <: >: HTML tags - * - *: Can interfere with comment blocks - * - /**: JSDoc comment start - * - ** /: JSDoc comment end - * - &: HTML entities - * - * XMLDoc (C#): - * - <: >: XML tags - * - &: ': ": <: >: XML special characters - * - {: }: Used for interpolated strings - * - ///: Comment marker - * - /**: Block comment start - * - ** /: Block comment end - * - * Javadoc (Java): - * - @: Used for Javadoc tags - * - <: >: HTML tags - * - &: HTML entities - * - *: Can interfere with comment blocks - * - /**: Javadoc comment start - * - ** /: Javadoc comment end - * - * Doxygen (C++): - * - \: Used for Doxygen commands - * - @: Alternative command prefix - * - <: >: XML/HTML tags - * - &: HTML entities - * - /**: C-style comment start - * - ** /: C-style comment end - * - * RDoc (Ruby): - * - :: Used in symbol notation - * - =: Section markers - * - #: Comment marker - * - =begin: Block comment start - * - =end: Block comment end - * - @: Instance variable prefix - * - $: Global variable prefix - * - %: String literal delimiter - * - #{: String interpolation start - * - }: String interpolation end - * - * PHPDoc (PHP): - * - @: Used for PHPDoc tags - * - {: }: Used for type definitions - * - $: Variable prefix - * - /**: PHPDoc comment start - * - ** /: PHPDoc comment end - * - *: Can interfere with comment blocks - * - &: HTML entities - */ - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts deleted file mode 100644 index ef1aee2d386e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithEnumBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithEnumBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts deleted file mode 100644 index 203651bfb712..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index 4023a0068946..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const WeatherReport = { - Sunny: "SUNNY", - Cloudy: "CLOUDY", - Raining: "RAINING", - Snowing: "SNOWING", -} as const; -export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts deleted file mode 100644 index c2a44b58ecd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * from "./enum/errors/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * from "./object/errors/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * from "./union/errors/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts deleted file mode 100644 index 2681788e4f04..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts deleted file mode 100644 index 203710315112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts deleted file mode 100644 index 230964f8467f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts deleted file mode 100644 index b8a86dc99dd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts deleted file mode 100644 index e38a83090455..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./NestedObjectWithOptionalFieldError.js"; -export * from "./NestedObjectWithRequiredFieldError.js"; -export * from "./ObjectWithOptionalFieldError.js"; -export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index 4898ba728836..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface DoubleOptional { - optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index 324bb2e73908..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithOptionalField { - string?: string; - nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index 322dcfbd5c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithRequiredField { - string: string; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index b35138a717bb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithMapOfMap { - map: Record>; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 2e6b3811b575..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithOptionalField { - /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ - string?: string; - integer?: number; - long?: number; - double?: number; - bool?: boolean; - datetime?: Date; - date?: string; - uuid?: string; - base64?: string; - list?: string[]; - set?: Set; - map?: Record; - bigint?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index 032a84135c9e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithRequiredField { - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index 5dac5b761df8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts deleted file mode 100644 index c0e5b750495f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithUnionBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithUnionBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts deleted file mode 100644 index 940b191924ee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index f5336c6b33bc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; - -export namespace Animal { - export interface Dog extends SeedExhaustive.types.Dog { - animal: "dog"; - } - - export interface Cat extends SeedExhaustive.types.Cat { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index aa74d5b7dd01..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Cat { - name: string; - likesToMeow: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 24bc9aa321b1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Dog { - name: string; - likesToWoof: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts deleted file mode 100644 index b556b3f7bd94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../core/index.js"; -import * as errors from "../errors/index.js"; - -export namespace BearerAuthProvider { - export interface Options { - token?: core.Supplier; - } -} - -export class BearerAuthProvider implements core.AuthProvider { - private readonly token: core.Supplier; - - constructor(options: BearerAuthProvider.Options) { - this.token = options.token; - } - - public static canCreate(options: BearerAuthProvider.Options): boolean { - return options.token != null; - } - - public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { - const token = await core.Supplier.get(this.token); - if (token == null) { - throw new errors.SeedExhaustiveError({ - message: "Please specify a token by passing it in to the constructor", - }); - } - - return { - headers: { Authorization: `Bearer ${token}` }, - }; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts deleted file mode 100644 index 0ecb12b79bdb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts deleted file mode 100644 index 895a50ff30da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export interface AuthProvider { - getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts deleted file mode 100644 index f6218b42211e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Request parameters for authentication requests. - */ -export interface AuthRequest { - /** - * The headers to be included in the request. - */ - headers: Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts deleted file mode 100644 index a64235910062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { base64Decode, base64Encode } from "../base64.js"; - -export interface BasicAuth { - username: string; - password: string; -} - -const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; - -export const BasicAuth = { - toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { - if (basicAuth == null) { - return undefined; - } - const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); - return `Basic ${token}`; - }, - fromAuthorizationHeader: (header: string): BasicAuth => { - const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); - const decoded = base64Decode(credentials); - const [username, ...passwordParts] = decoded.split(":"); - const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; - - if (username == null || password == null) { - throw new Error("Invalid basic auth"); - } - return { - username, - password, - }; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts deleted file mode 100644 index c44a06c38f06..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type BearerToken = string; - -const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; - -function toAuthorizationHeader(token: string | undefined): string | undefined { - if (token == null) { - return undefined; - } - return `Bearer ${token}`; -} - -export const BearerToken: { - toAuthorizationHeader: typeof toAuthorizationHeader; - fromAuthorizationHeader: (header: string) => BearerToken; -} = { - toAuthorizationHeader: toAuthorizationHeader, - fromAuthorizationHeader: (header: string): BearerToken => { - return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts deleted file mode 100644 index 5b7acfd2bd8b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { AuthProvider } from "./AuthProvider.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export class NoOpAuthProvider implements AuthProvider { - public getAuthRequest(): Promise { - return Promise.resolve({ headers: {} }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts deleted file mode 100644 index 2215b227709e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { AuthProvider } from "./AuthProvider.js"; -export type { AuthRequest } from "./AuthRequest.js"; -export { BasicAuth } from "./BasicAuth.js"; -export { BearerToken } from "./BearerToken.js"; -export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts deleted file mode 100644 index 448a0db638a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts +++ /dev/null @@ -1,27 +0,0 @@ -function base64ToBytes(base64: string): Uint8Array { - const binString = atob(base64); - return Uint8Array.from(binString, (m) => m.codePointAt(0)!); -} - -function bytesToBase64(bytes: Uint8Array): string { - const binString = String.fromCodePoint(...bytes); - return btoa(binString); -} - -export function base64Encode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "utf8").toString("base64"); - } - - const bytes = new TextEncoder().encode(input); - return bytesToBase64(bytes); -} - -export function base64Decode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "base64").toString("utf8"); - } - - const bytes = base64ToBytes(input); - return new TextDecoder().decode(bytes); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts deleted file mode 100644 index 69296d7100d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts deleted file mode 100644 index 97ab83c2b195..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RawResponse } from "./RawResponse.js"; - -/** - * The response of an API call. - * It is a successful response or a failed response. - */ -export type APIResponse = SuccessfulResponse | FailedResponse; - -export interface SuccessfulResponse { - ok: true; - body: T; - /** - * @deprecated Use `rawResponse` instead - */ - headers?: Record; - rawResponse: RawResponse; -} - -export interface FailedResponse { - ok: false; - error: T; - rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts deleted file mode 100644 index bca7f4c77981..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type BinaryResponse = { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - bodyUsed: Response["bodyUsed"]; - /** - * Returns a ReadableStream of the response body. - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) - */ - stream: () => Response["body"]; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer: () => ReturnType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob: () => ReturnType; - /** - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) - * Some versions of the Fetch API may not support this method. - */ - bytes?(): ReturnType; -}; - -export function getBinaryResponse(response: Response): BinaryResponse { - const binaryResponse: BinaryResponse = { - get bodyUsed() { - return response.bodyUsed; - }, - stream: () => response.body, - arrayBuffer: response.arrayBuffer.bind(response), - blob: response.blob.bind(response), - }; - if ("bytes" in response && typeof response.bytes === "function") { - binaryResponse.bytes = response.bytes.bind(response); - } - - return binaryResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts deleted file mode 100644 index 998d68f5c20c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type SecuritySchemeKey = string; -/** - * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. - * All schemes in the collection must be satisfied for authentication to be successful. - */ -export type SecuritySchemeCollection = Record; -export type AuthScope = string; -export type EndpointMetadata = { - /** - * An array of security scheme collections. Each collection represents an alternative way to authenticate. - */ - security?: SecuritySchemeCollection[]; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts deleted file mode 100644 index 8079841c4062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import type { Supplier } from "./Supplier.js"; - -type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; -export type EndpointSupplier = Supplier | EndpointSupplierFn; -export const EndpointSupplier = { - get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { - if (typeof supplier === "function") { - return (supplier as EndpointSupplierFn)(arg); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts deleted file mode 100644 index 58bb0e3ef7d9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts +++ /dev/null @@ -1,391 +0,0 @@ -import { toJson } from "../json.js"; -import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; -import type { APIResponse } from "./APIResponse.js"; -import { createRequestUrl } from "./createRequestUrl.js"; -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import { EndpointSupplier } from "./EndpointSupplier.js"; -import { getErrorResponseBody } from "./getErrorResponseBody.js"; -import { getFetchFn } from "./getFetchFn.js"; -import { getRequestBody } from "./getRequestBody.js"; -import { getResponseBody } from "./getResponseBody.js"; -import { Headers } from "./Headers.js"; -import { makeRequest } from "./makeRequest.js"; -import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -import { requestWithRetries } from "./requestWithRetries.js"; - -export type FetchFunction = (args: Fetcher.Args) => Promise>; - -export declare namespace Fetcher { - export interface Args { - url: string; - method: string; - contentType?: string; - headers?: Record | null | undefined>; - queryParameters?: Record; - body?: unknown; - timeoutMs?: number; - maxRetries?: number; - withCredentials?: boolean; - abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes" | "form" | "other"; - responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; - duplex?: "half"; - endpointMetadata?: EndpointMetadata; - fetchFn?: typeof fetch; - logging?: LogConfig | Logger; - } - - export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; - - export interface FailedStatusCodeError { - reason: "status-code"; - statusCode: number; - body: unknown; - } - - export interface NonJsonError { - reason: "non-json"; - statusCode: number; - rawBody: string; - } - - export interface BodyIsNullError { - reason: "body-is-null"; - statusCode: number; - } - - export interface TimeoutError { - reason: "timeout"; - } - - export interface UnknownError { - reason: "unknown"; - errorMessage: string; - } -} - -const SENSITIVE_HEADERS = new Set([ - "authorization", - "www-authenticate", - "x-api-key", - "api-key", - "apikey", - "x-api-token", - "x-auth-token", - "auth-token", - "cookie", - "set-cookie", - "proxy-authorization", - "proxy-authenticate", - "x-csrf-token", - "x-xsrf-token", - "x-session-token", - "x-access-token", -]); - -function redactHeaders(headers: Headers | Record): Record { - const filtered: Record = {}; - for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { - if (SENSITIVE_HEADERS.has(key.toLowerCase())) { - filtered[key] = "[REDACTED]"; - } else { - filtered[key] = value; - } - } - return filtered; -} - -const SENSITIVE_QUERY_PARAMS = new Set([ - "api_key", - "api-key", - "apikey", - "token", - "access_token", - "access-token", - "auth_token", - "auth-token", - "password", - "passwd", - "secret", - "api_secret", - "api-secret", - "apisecret", - "key", - "session", - "session_id", - "session-id", -]); - -function redactQueryParameters(queryParameters?: Record): Record | undefined { - if (queryParameters == null) { - return queryParameters; - } - const redacted: Record = {}; - for (const [key, value] of Object.entries(queryParameters)) { - if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { - redacted[key] = "[REDACTED]"; - } else { - redacted[key] = value; - } - } - return redacted; -} - -function redactUrl(url: string): string { - const protocolIndex = url.indexOf("://"); - if (protocolIndex === -1) return url; - - const afterProtocol = protocolIndex + 3; - - // Find the first delimiter that marks the end of the authority section - const pathStart = url.indexOf("/", afterProtocol); - let queryStart = url.indexOf("?", afterProtocol); - let fragmentStart = url.indexOf("#", afterProtocol); - - const firstDelimiter = Math.min( - pathStart === -1 ? url.length : pathStart, - queryStart === -1 ? url.length : queryStart, - fragmentStart === -1 ? url.length : fragmentStart, - ); - - // Find the LAST @ before the delimiter (handles multiple @ in credentials) - let atIndex = -1; - for (let i = afterProtocol; i < firstDelimiter; i++) { - if (url[i] === "@") { - atIndex = i; - } - } - - if (atIndex !== -1) { - url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; - } - - // Recalculate queryStart since url might have changed - queryStart = url.indexOf("?"); - if (queryStart === -1) return url; - - fragmentStart = url.indexOf("#", queryStart); - const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; - const queryString = url.slice(queryStart + 1, queryEnd); - - if (queryString.length === 0) return url; - - // FAST PATH: Quick check if any sensitive keywords present - // Using indexOf is faster than regex for simple substring matching - const lower = queryString.toLowerCase(); - const hasSensitive = - lower.includes("token") || - lower.includes("key") || - lower.includes("password") || - lower.includes("passwd") || - lower.includes("secret") || - lower.includes("session") || - lower.includes("auth"); - - if (!hasSensitive) { - return url; - } - - // SLOW PATH: Parse and redact - const redactedParams: string[] = []; - const params = queryString.split("&"); - - for (const param of params) { - const equalIndex = param.indexOf("="); - if (equalIndex === -1) { - redactedParams.push(param); - continue; - } - - const key = param.slice(0, equalIndex); - let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); - - if (!shouldRedact && key.includes("%")) { - try { - const decodedKey = decodeURIComponent(key); - shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); - } catch {} - } - - redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); - } - - return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); -} - -async function getHeaders(args: Fetcher.Args): Promise { - const newHeaders: Headers = new Headers(); - - newHeaders.set( - "Accept", - args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", - ); - if (args.body !== undefined && args.contentType != null) { - newHeaders.set("Content-Type", args.contentType); - } - - if (args.headers == null) { - return newHeaders; - } - - for (const [key, value] of Object.entries(args.headers)) { - const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); - if (typeof result === "string") { - newHeaders.set(key, result); - continue; - } - if (result == null) { - continue; - } - newHeaders.set(key, `${result}`); - } - return newHeaders; -} - -export async function fetcherImpl(args: Fetcher.Args): Promise> { - const url = createRequestUrl(args.url, args.queryParameters); - const requestBody: BodyInit | undefined = await getRequestBody({ - body: args.body, - type: args.requestType ?? "other", - }); - const fetchFn = args.fetchFn ?? (await getFetchFn()); - const headers = await getHeaders(args); - const logger = createLogger(args.logging); - - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - headers: redactHeaders(headers), - queryParameters: redactQueryParameters(args.queryParameters), - hasBody: requestBody != null, - }; - logger.debug("Making HTTP request", metadata); - } - - try { - const response = await requestWithRetries( - async () => - makeRequest( - fetchFn, - url, - args.method, - headers, - requestBody, - args.timeoutMs, - args.abortSignal, - args.withCredentials, - args.duplex, - ), - args.maxRetries, - ); - - if (response.status >= 200 && response.status < 400) { - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(response.headers), - }; - logger.debug("HTTP request succeeded", metadata); - } - const body = await getResponseBody(response, args.responseType); - return { - ok: true, - body: body as R, - headers: response.headers, - rawResponse: toRawResponse(response), - }; - } else { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), - }; - logger.error("HTTP request failed with error status", metadata); - } - return { - ok: false, - error: { - reason: "status-code", - statusCode: response.status, - body: await getErrorResponseBody(response), - }, - rawResponse: toRawResponse(response), - }; - } - } catch (error) { - if (args.abortSignal?.aborted) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - }; - logger.error("HTTP request was aborted", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: "The user aborted a request", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error && error.name === "AbortError") { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - timeoutMs: args.timeoutMs, - }; - logger.error("HTTP request timed out", metadata); - } - return { - ok: false, - error: { - reason: "timeout", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - errorMessage: error.message, - }; - logger.error("HTTP request failed with error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: error.message, - }, - rawResponse: unknownRawResponse, - }; - } - - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - error: toJson(error), - }; - logger.error("HTTP request failed with unknown error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: toJson(error), - }, - rawResponse: unknownRawResponse, - }; - } -} - -export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts deleted file mode 100644 index af841aa24f55..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts +++ /dev/null @@ -1,93 +0,0 @@ -let Headers: typeof globalThis.Headers; - -if (typeof globalThis.Headers !== "undefined") { - Headers = globalThis.Headers; -} else { - Headers = class Headers implements Headers { - private headers: Map; - - constructor(init?: HeadersInit) { - this.headers = new Map(); - - if (init) { - if (init instanceof Headers) { - init.forEach((value, key) => this.append(key, value)); - } else if (Array.isArray(init)) { - for (const [key, value] of init) { - if (typeof key === "string" && typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Each header entry must be a [string, string] tuple"); - } - } - } else { - for (const [key, value] of Object.entries(init)) { - if (typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Header values must be strings"); - } - } - } - } - } - - append(name: string, value: string): void { - const key = name.toLowerCase(); - const existing = this.headers.get(key) || []; - this.headers.set(key, [...existing, value]); - } - - delete(name: string): void { - const key = name.toLowerCase(); - this.headers.delete(key); - } - - get(name: string): string | null { - const key = name.toLowerCase(); - const values = this.headers.get(key); - return values ? values.join(", ") : null; - } - - has(name: string): boolean { - const key = name.toLowerCase(); - return this.headers.has(key); - } - - set(name: string, value: string): void { - const key = name.toLowerCase(); - this.headers.set(key, [value]); - } - - forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { - const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; - this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); - } - - getSetCookie(): string[] { - return this.headers.get("set-cookie") || []; - } - - *entries(): HeadersIterator<[string, string]> { - for (const [key, values] of this.headers.entries()) { - yield [key, values.join(", ")]; - } - } - - *keys(): HeadersIterator { - yield* this.headers.keys(); - } - - *values(): HeadersIterator { - for (const values of this.headers.values()) { - yield values.join(", "); - } - } - - [Symbol.iterator](): HeadersIterator<[string, string]> { - return this.entries(); - } - }; -} - -export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts deleted file mode 100644 index 692ca7d795f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { WithRawResponse } from "./RawResponse.js"; - -/** - * A promise that returns the parsed response and lets you retrieve the raw response too. - */ -export class HttpResponsePromise extends Promise { - private innerPromise: Promise>; - private unwrappedPromise: Promise | undefined; - - private constructor(promise: Promise>) { - // Initialize with a no-op to avoid premature parsing - super((resolve) => { - resolve(undefined as unknown as T); - }); - this.innerPromise = promise; - } - - /** - * Creates an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @param args - Arguments to pass to the function. - * @returns An `HttpResponsePromise` instance. - */ - public static fromFunction Promise>, T>( - fn: F, - ...args: Parameters - ): HttpResponsePromise { - return new HttpResponsePromise(fn(...args)); - } - - /** - * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @returns A function that returns an `HttpResponsePromise` instance. - */ - public static interceptFunction< - F extends (...args: never[]) => Promise>, - T = Awaited>["data"], - >(fn: F): (...args: Parameters) => HttpResponsePromise { - return (...args: Parameters): HttpResponsePromise => { - return HttpResponsePromise.fromPromise(fn(...args)); - }; - } - - /** - * Creates an `HttpResponsePromise` from an existing promise. - * - * @param promise - A promise resolving to a `WithRawResponse` object. - * @returns An `HttpResponsePromise` instance. - */ - public static fromPromise(promise: Promise>): HttpResponsePromise { - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from an executor function. - * - * @param executor - A function that takes resolve and reject callbacks to create a promise. - * @returns An `HttpResponsePromise` instance. - */ - public static fromExecutor( - executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, - ): HttpResponsePromise { - const promise = new Promise>(executor); - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from a resolved result. - * - * @param result - A `WithRawResponse` object to resolve immediately. - * @returns An `HttpResponsePromise` instance. - */ - public static fromResult(result: WithRawResponse): HttpResponsePromise { - const promise = Promise.resolve(result); - return new HttpResponsePromise(promise); - } - - private unwrap(): Promise { - if (!this.unwrappedPromise) { - this.unwrappedPromise = this.innerPromise.then(({ data }) => data); - } - return this.unwrappedPromise; - } - - /** @inheritdoc */ - public override then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, - ): Promise { - return this.unwrap().then(onfulfilled, onrejected); - } - - /** @inheritdoc */ - public override catch( - onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, - ): Promise { - return this.unwrap().catch(onrejected); - } - - /** @inheritdoc */ - public override finally(onfinally?: (() => void) | null): Promise { - return this.unwrap().finally(onfinally); - } - - /** - * Retrieves the data and raw response. - * - * @returns A promise resolving to a `WithRawResponse` object. - */ - public async withRawResponse(): Promise> { - return await this.innerPromise; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts deleted file mode 100644 index 37fb44e2aa99..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Headers } from "./Headers.js"; - -/** - * The raw response from the fetch call excluding the body. - */ -export type RawResponse = Omit< - { - [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions - }, - "ok" | "body" | "bodyUsed" ->; // strips out body and bodyUsed - -/** - * A raw response indicating that the request was aborted. - */ -export const abortRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 499, - statusText: "Client Closed Request", - type: "error", - url: "", -} as const; - -/** - * A raw response indicating an unknown error. - */ -export const unknownRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 0, - statusText: "Unknown Error", - type: "error", - url: "", -} as const; - -/** - * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, - * excluding the `body` and `bodyUsed` fields. - * - * @param response - The `RawResponse` object to convert. - * @returns A `RawResponse` object containing the extracted properties of the input response. - */ -export function toRawResponse(response: Response): RawResponse { - return { - headers: response.headers, - redirected: response.redirected, - status: response.status, - statusText: response.statusText, - type: response.type, - url: response.url, - }; -} - -/** - * Creates a `RawResponse` from a standard `Response` object. - */ -export interface WithRawResponse { - readonly data: T; - readonly rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts deleted file mode 100644 index 867c931c02f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type Supplier = T | Promise | (() => T | Promise); - -export const Supplier = { - get: async (supplier: Supplier): Promise => { - if (typeof supplier === "function") { - return (supplier as () => T)(); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts deleted file mode 100644 index 88e13265e112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { toQueryString } from "../url/qs.js"; - -export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { - const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); - return queryString ? `${baseUrl}?${queryString}` : baseUrl; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts deleted file mode 100644 index 7cf4e623c2f5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { fromJson } from "../json.js"; -import { getResponseBody } from "./getResponseBody.js"; - -export async function getErrorResponseBody(response: Response): Promise { - let contentType = response.headers.get("Content-Type")?.toLowerCase(); - if (contentType == null || contentType.length === 0) { - return getResponseBody(response); - } - - if (contentType.indexOf(";") !== -1) { - contentType = contentType.split(";")[0]?.trim() ?? ""; - } - switch (contentType) { - case "application/hal+json": - case "application/json": - case "application/ld+json": - case "application/problem+json": - case "application/vnd.api+json": - case "text/json": { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - default: - if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - - // Fallback to plain text if content type is not recognized - // Even if no body is present, the response will be an empty string - return await response.text(); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts deleted file mode 100644 index 9f845b956392..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function getFetchFn(): Promise { - return fetch; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts deleted file mode 100644 index 50f922b0e87f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function getHeader(headers: Record, header: string): string | undefined { - for (const [headerKey, headerValue] of Object.entries(headers)) { - if (headerKey.toLowerCase() === header.toLowerCase()) { - return headerValue; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts deleted file mode 100644 index 91d9d81f50e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toJson } from "../json.js"; -import { toQueryString } from "../url/qs.js"; - -export declare namespace GetRequestBody { - interface Args { - body: unknown; - type: "json" | "file" | "bytes" | "form" | "other"; - } -} - -export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { - if (type === "form") { - return toQueryString(body, { arrayFormat: "repeat", encode: true }); - } - if (type.includes("json")) { - return toJson(body); - } else { - return body as BodyInit; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts deleted file mode 100644 index 708d55728f2b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { fromJson } from "../json.js"; -import { getBinaryResponse } from "./BinaryResponse.js"; - -export async function getResponseBody(response: Response, responseType?: string): Promise { - switch (responseType) { - case "binary-response": - return getBinaryResponse(response); - case "blob": - return await response.blob(); - case "arrayBuffer": - return await response.arrayBuffer(); - case "sse": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - return response.body; - case "streaming": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - - return response.body; - - case "text": - return await response.text(); - } - - // if responseType is "json" or not specified, try to parse as JSON - const text = await response.text(); - if (text.length > 0) { - try { - const responseBody = fromJson(text); - return responseBody; - } catch (_err) { - return { - ok: false, - error: { - reason: "non-json", - statusCode: response.status, - rawBody: text, - }, - }; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts deleted file mode 100644 index c3bc6da20f49..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type { APIResponse } from "./APIResponse.js"; -export type { BinaryResponse } from "./BinaryResponse.js"; -export type { EndpointMetadata } from "./EndpointMetadata.js"; -export { EndpointSupplier } from "./EndpointSupplier.js"; -export type { Fetcher, FetchFunction } from "./Fetcher.js"; -export { fetcher } from "./Fetcher.js"; -export { getHeader } from "./getHeader.js"; -export { HttpResponsePromise } from "./HttpResponsePromise.js"; -export type { RawResponse, WithRawResponse } from "./RawResponse.js"; -export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts deleted file mode 100644 index 921565eb0063..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { anySignal, getTimeoutSignal } from "./signals.js"; - -export const makeRequest = async ( - fetchFn: (url: string, init: RequestInit) => Promise, - url: string, - method: string, - headers: Headers | Record, - requestBody: BodyInit | undefined, - timeoutMs?: number, - abortSignal?: AbortSignal, - withCredentials?: boolean, - duplex?: "half", -): Promise => { - const signals: AbortSignal[] = []; - - let timeoutAbortId: ReturnType | undefined; - if (timeoutMs != null) { - const { signal, abortId } = getTimeoutSignal(timeoutMs); - timeoutAbortId = abortId; - signals.push(signal); - } - - if (abortSignal != null) { - signals.push(abortSignal); - } - const newSignals = anySignal(signals); - const response = await fetchFn(url, { - method: method, - headers, - body: requestBody, - signal: newSignals, - credentials: withCredentials ? "include" : undefined, - // @ts-ignore - duplex, - }); - - if (timeoutAbortId != null) { - clearTimeout(timeoutAbortId); - } - - return response; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts deleted file mode 100644 index 1f689688c4b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts +++ /dev/null @@ -1,64 +0,0 @@ -const INITIAL_RETRY_DELAY = 1000; // in milliseconds -const MAX_RETRY_DELAY = 60000; // in milliseconds -const DEFAULT_MAX_RETRIES = 2; -const JITTER_FACTOR = 0.2; // 20% random jitter - -function addPositiveJitter(delay: number): number { - const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function addSymmetricJitter(delay: number): number { - const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { - const retryAfter = response.headers.get("Retry-After"); - if (retryAfter) { - const retryAfterSeconds = parseInt(retryAfter, 10); - if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { - return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); - } - - const retryAfterDate = new Date(retryAfter); - if (!Number.isNaN(retryAfterDate.getTime())) { - const delay = retryAfterDate.getTime() - Date.now(); - if (delay > 0) { - return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); - } - } - } - - const rateLimitReset = response.headers.get("X-RateLimit-Reset"); - if (rateLimitReset) { - const resetTime = parseInt(rateLimitReset, 10); - if (!Number.isNaN(resetTime)) { - const delay = resetTime * 1000 - Date.now(); - if (delay > 0) { - return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); - } - } - } - - return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); -} - -export async function requestWithRetries( - requestFn: () => Promise, - maxRetries: number = DEFAULT_MAX_RETRIES, -): Promise { - let response: Response = await requestFn(); - - for (let i = 0; i < maxRetries; ++i) { - if ([408, 429].includes(response.status) || response.status >= 500) { - const delay = getRetryDelayFromHeaders(response, i); - - await new Promise((resolve) => setTimeout(resolve, delay)); - response = await requestFn(); - } else { - break; - } - } - return response!; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts deleted file mode 100644 index 7bd3757ec3a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts +++ /dev/null @@ -1,26 +0,0 @@ -const TIMEOUT = "timeout"; - -export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { - const controller = new AbortController(); - const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); - return { signal: controller.signal, abortId }; -} - -export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { - const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; - - const controller = new AbortController(); - - for (const signal of signals) { - if (signal.aborted) { - controller.abort((signal as any)?.reason); - break; - } - - signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { - signal: controller.signal, - }); - } - - return controller.signal; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts deleted file mode 100644 index 78ed8b500c95..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts +++ /dev/null @@ -1,35 +0,0 @@ -export function mergeHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } else if (insensitiveKey in result) { - delete result[insensitiveKey]; - } - } - - return result; -} - -export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } - } - - return result; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts deleted file mode 100644 index 92290bfadcac..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from "./auth/index.js"; -export * from "./base64.js"; -export * from "./fetcher/index.js"; -export * as logging from "./logging/index.js"; -export * from "./runtime/index.js"; -export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts deleted file mode 100644 index c052f3249f4f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Serialize a value to JSON - * @param value A JavaScript value, usually an object or array, to be converted. - * @param replacer A function that transforms the results. - * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. - * @returns JSON string - */ -export const toJson = ( - value: unknown, - replacer?: (this: unknown, key: string, value: unknown) => unknown, - space?: string | number, -): string => { - return JSON.stringify(value, replacer, space); -}; - -/** - * Parse JSON string to object, array, or other type - * @param text A valid JSON string. - * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. - * @returns Parsed object, array, or other type - */ -export function fromJson( - text: string, - reviver?: (this: unknown, key: string, value: unknown) => unknown, -): T { - return JSON.parse(text, reviver); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts deleted file mode 100644 index 88f6c00db0cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as logger from "./logger.js"; - -export namespace logging { - /** - * Configuration for logger instances. - */ - export type LogConfig = logger.LogConfig; - export type LogLevel = logger.LogLevel; - export const LogLevel: typeof logger.LogLevel = logger.LogLevel; - export type ILogger = logger.ILogger; - /** - * Console logger implementation that outputs to the console. - */ - export type ConsoleLogger = logger.ConsoleLogger; - /** - * Console logger implementation that outputs to the console. - */ - export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts deleted file mode 100644 index d81cc32c40f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts deleted file mode 100644 index a3f3673cda93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts +++ /dev/null @@ -1,203 +0,0 @@ -export const LogLevel = { - Debug: "debug", - Info: "info", - Warn: "warn", - Error: "error", -} as const; -export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; -const logLevelMap: Record = { - [LogLevel.Debug]: 1, - [LogLevel.Info]: 2, - [LogLevel.Warn]: 3, - [LogLevel.Error]: 4, -}; - -export interface ILogger { - /** - * Logs a debug message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - debug(message: string, ...args: unknown[]): void; - /** - * Logs an info message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - info(message: string, ...args: unknown[]): void; - /** - * Logs a warning message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - warn(message: string, ...args: unknown[]): void; - /** - * Logs an error message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - error(message: string, ...args: unknown[]): void; -} - -/** - * Configuration for logger initialization. - */ -export interface LogConfig { - /** - * Minimum log level to output. - * @default LogLevel.Info - */ - level?: LogLevel; - /** - * Logger implementation to use. - * @default new ConsoleLogger() - */ - logger?: ILogger; - /** - * Whether logging should be silenced. - * @default true - */ - silent?: boolean; -} - -/** - * Default console-based logger implementation. - */ -export class ConsoleLogger implements ILogger { - debug(message: string, ...args: unknown[]): void { - console.debug(message, ...args); - } - info(message: string, ...args: unknown[]): void { - console.info(message, ...args); - } - warn(message: string, ...args: unknown[]): void { - console.warn(message, ...args); - } - error(message: string, ...args: unknown[]): void { - console.error(message, ...args); - } -} - -/** - * Logger class that provides level-based logging functionality. - */ -export class Logger { - private readonly level: number; - private readonly logger: ILogger; - private readonly silent: boolean; - - /** - * Creates a new logger instance. - * @param config - Logger configuration - */ - constructor(config: Required) { - this.level = logLevelMap[config.level]; - this.logger = config.logger; - this.silent = config.silent; - } - - /** - * Checks if a log level should be output based on configuration. - * @param level - The log level to check - * @returns True if the level should be logged - */ - public shouldLog(level: LogLevel): boolean { - return !this.silent && this.level <= logLevelMap[level]; - } - - /** - * Checks if debug logging is enabled. - * @returns True if debug logs should be output - */ - public isDebug(): boolean { - return this.shouldLog(LogLevel.Debug); - } - - /** - * Logs a debug message if debug logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public debug(message: string, ...args: unknown[]): void { - if (this.isDebug()) { - this.logger.debug(message, ...args); - } - } - - /** - * Checks if info logging is enabled. - * @returns True if info logs should be output - */ - public isInfo(): boolean { - return this.shouldLog(LogLevel.Info); - } - - /** - * Logs an info message if info logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public info(message: string, ...args: unknown[]): void { - if (this.isInfo()) { - this.logger.info(message, ...args); - } - } - - /** - * Checks if warning logging is enabled. - * @returns True if warning logs should be output - */ - public isWarn(): boolean { - return this.shouldLog(LogLevel.Warn); - } - - /** - * Logs a warning message if warning logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public warn(message: string, ...args: unknown[]): void { - if (this.isWarn()) { - this.logger.warn(message, ...args); - } - } - - /** - * Checks if error logging is enabled. - * @returns True if error logs should be output - */ - public isError(): boolean { - return this.shouldLog(LogLevel.Error); - } - - /** - * Logs an error message if error logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public error(message: string, ...args: unknown[]): void { - if (this.isError()) { - this.logger.error(message, ...args); - } - } -} - -export function createLogger(config?: LogConfig | Logger): Logger { - if (config == null) { - return defaultLogger; - } - if (config instanceof Logger) { - return config; - } - config = config ?? {}; - config.level ??= LogLevel.Info; - config.logger ??= new ConsoleLogger(); - config.silent ??= true; - return new Logger(config as Required); -} - -const defaultLogger: Logger = new Logger({ - level: LogLevel.Info, - logger: new ConsoleLogger(), - silent: true, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts deleted file mode 100644 index cfab23f9a834..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts deleted file mode 100644 index 56ebbb87c4d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts +++ /dev/null @@ -1,134 +0,0 @@ -interface DenoGlobal { - version: { - deno: string; - }; -} - -interface BunGlobal { - version: string; -} - -declare const Deno: DenoGlobal | undefined; -declare const Bun: BunGlobal | undefined; -declare const EdgeRuntime: string | undefined; -declare const self: typeof globalThis.self & { - importScripts?: unknown; -}; - -/** - * A constant that indicates which environment and version the SDK is running in. - */ -export const RUNTIME: Runtime = evaluateRuntime(); - -export interface Runtime { - type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; - version?: string; - parsedVersion?: number; -} - -function evaluateRuntime(): Runtime { - /** - * A constant that indicates whether the environment the code is running is a Web Browser. - */ - const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - if (isBrowser) { - return { - type: "browser", - version: window.navigator.userAgent, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Cloudflare. - * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent - */ - const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; - if (isCloudflare) { - return { - type: "workerd", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Edge Runtime. - * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime - */ - const isEdgeRuntime = typeof EdgeRuntime === "string"; - if (isEdgeRuntime) { - return { - type: "edge-runtime", - }; - } - - /** - * A constant that indicates whether the environment the code is running is a Web Worker. - */ - const isWebWorker = - typeof self === "object" && - typeof self?.importScripts === "function" && - (self.constructor?.name === "DedicatedWorkerGlobalScope" || - self.constructor?.name === "ServiceWorkerGlobalScope" || - self.constructor?.name === "SharedWorkerGlobalScope"); - if (isWebWorker) { - return { - type: "web-worker", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Deno. - * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions - */ - const isDeno = - typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - if (isDeno) { - return { - type: "deno", - version: Deno.version.deno, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Bun.sh. - */ - const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; - if (isBun) { - return { - type: "bun", - version: Bun.version, - }; - } - - /** - * A constant that indicates whether the environment the code is running is in React-Native. - * This check should come before Node.js detection since React Native may have a process polyfill. - * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js - */ - const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; - if (isReactNative) { - return { - type: "react-native", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ - const isNode = - typeof process !== "undefined" && - "version" in process && - !!process.version && - "versions" in process && - !!process.versions?.node; - if (isNode) { - return { - type: "node", - version: process.versions.node, - parsedVersion: Number(process.versions.node.split(".")[0]), - }; - } - - return { - type: "unknown", - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts deleted file mode 100644 index 19b901244218..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function encodePathParam(param: unknown): string { - if (param === null) { - return "null"; - } - const typeofParam = typeof param; - switch (typeofParam) { - case "undefined": - return "undefined"; - case "string": - case "number": - case "boolean": - break; - default: - param = String(param); - break; - } - return encodeURIComponent(param as string | number | boolean); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts deleted file mode 100644 index f2e0fa2d2221..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { encodePathParam } from "./encodePathParam.js"; -export { join } from "./join.js"; -export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts deleted file mode 100644 index 7ca7daef094d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts +++ /dev/null @@ -1,79 +0,0 @@ -export function join(base: string, ...segments: string[]): string { - if (!base) { - return ""; - } - - if (segments.length === 0) { - return base; - } - - if (base.includes("://")) { - let url: URL; - try { - url = new URL(base); - } catch { - return joinPath(base, ...segments); - } - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - url.pathname = joinPathSegments(url.pathname, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { - url.pathname += "/"; - } - - return url.toString(); - } - - return joinPath(base, ...segments); -} - -function joinPath(base: string, ...segments: string[]): string { - if (segments.length === 0) { - return base; - } - - let result = base; - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - result = joinPathSegments(result, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !result.endsWith("/")) { - result += "/"; - } - - return result; -} - -function joinPathSegments(left: string, right: string): string { - if (left.endsWith("/")) { - return left + right; - } - return `${left}/${right}`; -} - -function trimSlashes(str: string): string { - if (!str) return str; - - let start = 0; - let end = str.length; - - if (str.startsWith("/")) start = 1; - if (str.endsWith("/")) end = str.length - 1; - - return start === 0 && end === str.length ? str : str.slice(start, end); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts deleted file mode 100644 index 13e89be9d9a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts +++ /dev/null @@ -1,74 +0,0 @@ -interface QueryStringOptions { - arrayFormat?: "indices" | "repeat"; - encode?: boolean; -} - -const defaultQsOptions: Required = { - arrayFormat: "indices", - encode: true, -} as const; - -function encodeValue(value: unknown, shouldEncode: boolean): string { - if (value === undefined) { - return ""; - } - if (value === null) { - return ""; - } - const stringValue = String(value); - return shouldEncode ? encodeURIComponent(stringValue) : stringValue; -} - -function stringifyObject(obj: Record, prefix = "", options: Required): string[] { - const parts: string[] = []; - - for (const [key, value] of Object.entries(obj)) { - const fullKey = prefix ? `${prefix}[${key}]` : key; - - if (value === undefined) { - continue; - } - - if (Array.isArray(value)) { - if (value.length === 0) { - continue; - } - for (let i = 0; i < value.length; i++) { - const item = value[i]; - if (item === undefined) { - continue; - } - if (typeof item === "object" && !Array.isArray(item) && item !== null) { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - parts.push(...stringifyObject(item as Record, arrayKey, options)); - } else { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; - parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); - } - } - } else if (typeof value === "object" && value !== null) { - if (Object.keys(value as Record).length === 0) { - continue; - } - parts.push(...stringifyObject(value as Record, fullKey, options)); - } else { - const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; - parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); - } - } - - return parts; -} - -export function toQueryString(obj: unknown, options?: QueryStringOptions): string { - if (obj == null || typeof obj !== "object") { - return ""; - } - - const parts = stringifyObject(obj as Record, "", { - ...defaultQsOptions, - ...options, - }); - return parts.join("&"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts deleted file mode 100644 index d2e515f5d4e2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import { toJson } from "../core/json.js"; - -export class SeedExhaustiveError extends Error { - public readonly statusCode?: number; - public readonly body?: unknown; - public readonly rawResponse?: core.RawResponse; - - constructor({ - message, - statusCode, - body, - rawResponse, - }: { - message?: string; - statusCode?: number; - body?: unknown; - rawResponse?: core.RawResponse; - }) { - super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - this.statusCode = statusCode; - this.body = body; - this.rawResponse = rawResponse; - } -} - -function buildMessage({ - message, - statusCode, - body, -}: { - message: string | undefined; - statusCode: number | undefined; - body: unknown | undefined; -}): string { - const lines: string[] = []; - if (message != null) { - lines.push(message); - } - - if (statusCode != null) { - lines.push(`Status code: ${statusCode.toString()}`); - } - - if (body != null) { - lines.push(`Body: ${toJson(body, undefined, 2)}`); - } - - return lines.join("\n"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts deleted file mode 100644 index 82a3cb8de266..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export class SeedExhaustiveTimeoutError extends Error { - constructor(message: string) { - super(message); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts deleted file mode 100644 index deb55c602654..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import * as errors from "./index.js"; - -export function handleNonStatusCodeError( - error: core.Fetcher.Error, - rawResponse: core.RawResponse, - method: string, - path: string, -): never { - switch (error.reason) { - case "non-json": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - body: error.rawBody, - rawResponse: rawResponse, - }); - case "body-is-null": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - rawResponse: rawResponse, - }); - case "timeout": - throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); - case "unknown": - throw new errors.SeedExhaustiveError({ - message: error.errorMessage, - rawResponse: rawResponse, - }); - default: - throw new errors.SeedExhaustiveError({ - message: "Unknown error", - rawResponse: rawResponse, - }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts deleted file mode 100644 index 2e2853073a94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; -export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts deleted file mode 100644 index 7b70ee14fc02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts deleted file mode 100644 index 9f0bdd34e0d5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * as SeedExhaustive from "./api/index.js"; -export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -export { SeedExhaustiveClient } from "./Client.js"; -export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; -export * from "./exports.js"; -export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts deleted file mode 100644 index 3e5dc038a0ae..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ /dev/null @@ -1,46 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = z.array(ObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, -}; - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -const _Response_Schema = z.array(ObjectWithRequiredField._schema); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, -}; - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts deleted file mode 100644 index d5c3cd1ae608..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.array(z.string()); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string[]; - json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string[], - json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string[]; -} - -const _Response_Schema = z.array(z.string()); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string[]; - json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string[], - json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts deleted file mode 100644 index 000bdb1a9f9a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ /dev/null @@ -1,47 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = z.record(z.string(), ObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: ( - parsed: Record, - ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, - json: (parsed: Record) => - Object.fromEntries( - Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), - ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, -}; - -export declare namespace Request { - export type Raw = Record; -} - -const _Response_Schema = z.record(z.string(), ObjectWithRequiredField._schema); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: ( - parsed: Record, - ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => - _Response_Schema.parse(raw) as Record, - json: (parsed: Record) => - Object.fromEntries( - Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), - ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, -}; - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts deleted file mode 100644 index f5db8ef1efae..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ /dev/null @@ -1,36 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.record(z.string(), z.string()); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, - json: (parsed: Record) => - parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, -}; - -export declare namespace Request { - export type Raw = Record; -} - -const _Response_Schema = z.record(z.string(), z.string()); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Record; - json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as Record, - json: (parsed: Record) => - parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, -}; - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts deleted file mode 100644 index fb36dd017dc2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ /dev/null @@ -1,46 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = ObjectWithRequiredField._schema.optional(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, - ) => serializers.endpoints.container.getAndReturnOptional.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => - parsed != null - ? ObjectWithRequiredField.json(parsed) - : (parsed as serializers.endpoints.container.getAndReturnOptional.Request.Raw), -}; - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} - -const _Response_Schema = ObjectWithRequiredField._schema.optional(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, - ) => serializers.endpoints.container.getAndReturnOptional.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => - parsed != null - ? ObjectWithRequiredField.json(parsed) - : (parsed as serializers.endpoints.container.getAndReturnOptional.Response.Raw), -}; - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts deleted file mode 100644 index 0c85a32c4a09..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ /dev/null @@ -1,46 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -const _Request_Schema = z.array(ObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, -}; - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -const _Response_Schema = z.array(ObjectWithRequiredField._schema); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.ObjectWithRequiredField[], - ) => serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => - parsed.map((item) => - ObjectWithRequiredField.json(item), - ) as serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, -}; - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts deleted file mode 100644 index f80628d1136e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ /dev/null @@ -1,36 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.array(z.string()).transform((arr) => new Set(arr)); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Set; - json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Set, - json: (parsed: Set) => - Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string[]; -} - -const _Response_Schema = z.array(z.string()).transform((arr) => new Set(arr)); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Set; - json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as Set, - json: (parsed: Set) => - Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index 1972f5b270f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; -export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; -export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; -export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; -export * as getAndReturnOptional from "./getAndReturnOptional.js"; -export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; -export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index e053119b972c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as testDelete from "./testDelete.js"; -export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts deleted file mode 100644 index f770bb3d0434..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.boolean(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.endpoints.httpMethods.testDelete.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.endpoints.httpMethods.testDelete.Response.Raw, -}; - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts deleted file mode 100644 index ee29c6d64e90..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.httpMethods.testGet.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.httpMethods.testGet.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts deleted file mode 100644 index cd7e640937da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as container from "./container/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts deleted file mode 100644 index 2ffc5ec115c4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; - -const _Request_Schema = z.array(NestedObjectWithRequiredField._schema); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField[]; - json: ( - parsed: SeedExhaustive.types.NestedObjectWithRequiredField[], - ) => serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField[], - json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField[]) => - parsed.map((item) => - NestedObjectWithRequiredField.json(item), - ) as serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, -}; - -export declare namespace Request { - export type Raw = NestedObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index d00c4c582910..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts deleted file mode 100644 index 62d66628879c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.getWithInlinePath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.getWithInlinePath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts deleted file mode 100644 index 28e0a88b1335..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.getWithPath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.getWithPath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index b30603cae602..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as getWithInlinePath from "./getWithInlinePath.js"; -export * as getWithPath from "./getWithPath.js"; -export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; -export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts deleted file mode 100644 index 920948641520..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts deleted file mode 100644 index f2004c062f3b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts deleted file mode 100644 index 7761ce306fe3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts deleted file mode 100644 index ea9575e1ce1e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.boolean(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Request.Raw, -}; - -export declare namespace Request { - export type Raw = boolean; -} - -const _Response_Schema = z.boolean(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Response.Raw, -}; - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts deleted file mode 100644 index 52cc217d53a2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts deleted file mode 100644 index 337a002320dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string().transform((s) => new Date(s)); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Date; - json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as Date, - json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string().transform((s) => new Date(s)); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => Date; - json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as Date, - json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts deleted file mode 100644 index b04a1153d28b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.number(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, -}; - -export declare namespace Request { - export type Raw = number; -} - -const _Response_Schema = z.number(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, -}; - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts deleted file mode 100644 index 40b6b5b97418..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.number(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Request.Raw, -}; - -export declare namespace Request { - export type Raw = number; -} - -const _Response_Schema = z.number(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Response.Raw, -}; - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts deleted file mode 100644 index 0fc1f2cdff59..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.number(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Request.Raw, -}; - -export declare namespace Request { - export type Raw = number; -} - -const _Response_Schema = z.number(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => number; - json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as number, - json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Response.Raw, -}; - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts deleted file mode 100644 index ec9d5995de47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts deleted file mode 100644 index 7f5c79800271..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ /dev/null @@ -1,34 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index 9805ab86b129..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as getAndReturnBase64 from "./getAndReturnBase64.js"; -export * as getAndReturnBool from "./getAndReturnBool.js"; -export * as getAndReturnDate from "./getAndReturnDate.js"; -export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; -export * as getAndReturnDouble from "./getAndReturnDouble.js"; -export * as getAndReturnInt from "./getAndReturnInt.js"; -export * as getAndReturnLong from "./getAndReturnLong.js"; -export * as getAndReturnString from "./getAndReturnString.js"; -export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index fda956fe3da3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ErrorCategory_Schema = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); -export const ErrorCategory: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCategory; - json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => serializers.endpoints.ErrorCategory.Raw; -} = { - _schema: _ErrorCategory_Schema, - parse: (raw: unknown) => _ErrorCategory_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCategory, - json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => parsed as serializers.endpoints.ErrorCategory.Raw, -}; - -export declare namespace ErrorCategory { - export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 0daa10ba1c93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,43 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ErrorCode_Schema = z.enum([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", -]); -export const ErrorCode: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCode; - json: (parsed: SeedExhaustive.endpoints.ErrorCode) => serializers.endpoints.ErrorCode.Raw; -} = { - _schema: _ErrorCode_Schema, - parse: (raw: unknown) => _ErrorCode_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCode, - json: (parsed: SeedExhaustive.endpoints.ErrorCode) => parsed as serializers.endpoints.ErrorCode.Raw, -}; - -export declare namespace ErrorCode { - export type Raw = - | "INTERNAL_SERVER_ERROR" - | "UNAUTHORIZED" - | "FORBIDDEN" - | "BAD_REQUEST" - | "CONFLICT" - | "GONE" - | "UNPROCESSABLE_ENTITY" - | "NOT_IMPLEMENTED" - | "BAD_GATEWAY" - | "SERVICE_UNAVAILABLE" - | "Unknown"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 917889e06380..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,38 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ErrorCategory } from "./ErrorCategory.js"; -import { ErrorCode } from "./ErrorCode.js"; - -const _Error__Schema = z.object({ - category: ErrorCategory._schema, - code: ErrorCode._schema, - detail: z.string().optional(), - field: z.string().optional(), -}); -export const Error_: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.Error_; - json: (parsed: SeedExhaustive.endpoints.Error_) => serializers.endpoints.Error_.Raw; -} = { - _schema: _Error__Schema, - parse: (raw: unknown) => _Error__Schema.parse(raw) as SeedExhaustive.endpoints.Error_, - json: (parsed: SeedExhaustive.endpoints.Error_) => - ({ - category: ErrorCategory.json(parsed.category), - code: ErrorCode.json(parsed.code), - detail: parsed.detail, - field: parsed.field, - }) as serializers.endpoints.Error_.Raw, -}; - -export declare namespace Error_ { - export interface Raw { - category: ErrorCategory.Raw; - code: ErrorCode.Raw; - detail?: string | null; - field?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 520e6cfb62b7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Error_ } from "./Error_.js"; - -const _PutResponse_Schema = z.object({ - errors: z.array(Error_._schema).optional(), -}); -export const PutResponse: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.endpoints.PutResponse; - json: (parsed: SeedExhaustive.endpoints.PutResponse) => serializers.endpoints.PutResponse.Raw; -} = { - _schema: _PutResponse_Schema, - parse: (raw: unknown) => _PutResponse_Schema.parse(raw) as SeedExhaustive.endpoints.PutResponse, - json: (parsed: SeedExhaustive.endpoints.PutResponse) => - ({ - errors: - parsed.errors != null - ? parsed.errors != null - ? parsed.errors.map((item) => Error_.json(item)) - : parsed.errors - : parsed.errors, - }) as serializers.endpoints.PutResponse.Raw, -}; - -export declare namespace PutResponse { - export interface Raw { - errors?: Error_.Raw[] | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index 66e101cdc2d7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as noEndingSlash from "./noEndingSlash.js"; -export * as withEndingSlash from "./withEndingSlash.js"; -export * as withMixedCase from "./withMixedCase.js"; -export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts deleted file mode 100644 index 792cdff843dd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.noEndingSlash.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.noEndingSlash.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts deleted file mode 100644 index 05918aed9575..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.withEndingSlash.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.withEndingSlash.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts deleted file mode 100644 index ef6df73d7ec0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.withMixedCase.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.withMixedCase.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts deleted file mode 100644 index 3e792cbc8530..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.endpoints.urls.withUnderscores.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.endpoints.urls.withUnderscores.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index f7a345d3368a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../api/index.js"; -import type * as serializers from "../../../index.js"; - -const _BadObjectRequestInfo_Schema = z.object({ - message: z.string(), -}); -export const BadObjectRequestInfo: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.BadObjectRequestInfo; - json: (parsed: SeedExhaustive.BadObjectRequestInfo) => serializers.BadObjectRequestInfo.Raw; -} = { - _schema: _BadObjectRequestInfo_Schema, - parse: (raw: unknown) => _BadObjectRequestInfo_Schema.parse(raw) as SeedExhaustive.BadObjectRequestInfo, - json: (parsed: SeedExhaustive.BadObjectRequestInfo) => parsed as serializers.BadObjectRequestInfo.Raw, -}; - -export declare namespace BadObjectRequestInfo { - export interface Raw { - message: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts deleted file mode 100644 index 20b614a89e2f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index afdc575ededd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,40 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../api/index.js"; -import type * as serializers from "../../../../index.js"; -import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; - -const _PostWithObjectBody_Schema = z - .object({ - string: z.string(), - integer: z.number(), - NestedObject: ObjectWithOptionalField._schema, - }) - .transform((data) => ({ - string: data.string, - integer: data.integer, - nestedObject: data.NestedObject, - })); -export const PostWithObjectBody: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.PostWithObjectBody; - json: (parsed: SeedExhaustive.PostWithObjectBody) => serializers.PostWithObjectBody.Raw; -} = { - _schema: _PostWithObjectBody_Schema, - parse: (raw: unknown) => _PostWithObjectBody_Schema.parse(raw) as SeedExhaustive.PostWithObjectBody, - json: (parsed: SeedExhaustive.PostWithObjectBody) => - ({ - string: parsed.string, - integer: parsed.integer, - NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), - }) as serializers.PostWithObjectBody.Raw, -}; - -export declare namespace PostWithObjectBody { - export interface Raw { - string: string; - integer: number; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index d62a81ce61fd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts deleted file mode 100644 index 549edcdba7f2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts deleted file mode 100644 index 7c8d3bf63cc1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../index.js"; - -const _Response_Schema = z.boolean(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => boolean; - json: (parsed: boolean) => serializers.noAuth.postWithNoAuth.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, - json: (parsed: boolean) => parsed as serializers.noAuth.postWithNoAuth.Response.Raw, -}; - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts deleted file mode 100644 index b62616349ec6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts deleted file mode 100644 index 5880dd1a7111..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../index.js"; - -const _Response_Schema = z.string(); -export const Response: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.noReqBody.postWithNoRequestBody.Response.Raw; -} = { - _schema: _Response_Schema, - parse: (raw: unknown) => _Response_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.noReqBody.postWithNoRequestBody.Response.Raw, -}; - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts deleted file mode 100644 index f3d5598805ba..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as serializers from "../../../index.js"; - -const _Request_Schema = z.string(); -export const Request: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => string; - json: (parsed: string) => serializers.reqWithHeaders.getWithCustomHeader.Request.Raw; -} = { - _schema: _Request_Schema, - parse: (raw: unknown) => _Request_Schema.parse(raw) as string, - json: (parsed: string) => parsed as serializers.reqWithHeaders.getWithCustomHeader.Request.Raw, -}; - -export declare namespace Request { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index fb7f25afb170..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index fda1be806c19..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithDocs_Schema = z.object({ - string: z.string(), -}); -export const ObjectWithDocs: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithDocs; - json: (parsed: SeedExhaustive.types.ObjectWithDocs) => serializers.types.ObjectWithDocs.Raw; -} = { - _schema: _ObjectWithDocs_Schema, - parse: (raw: unknown) => _ObjectWithDocs_Schema.parse(raw) as SeedExhaustive.types.ObjectWithDocs, - json: (parsed: SeedExhaustive.types.ObjectWithDocs) => parsed as serializers.types.ObjectWithDocs.Raw, -}; - -export declare namespace ObjectWithDocs { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index feebc1f6a916..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _WeatherReport_Schema = z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); -export const WeatherReport: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.WeatherReport; - json: (parsed: SeedExhaustive.types.WeatherReport) => serializers.types.WeatherReport.Raw; -} = { - _schema: _WeatherReport_Schema, - parse: (raw: unknown) => _WeatherReport_Schema.parse(raw) as SeedExhaustive.types.WeatherReport, - json: (parsed: SeedExhaustive.types.WeatherReport) => parsed as serializers.types.WeatherReport.Raw, -}; - -export declare namespace WeatherReport { - export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts deleted file mode 100644 index 52175f3cee16..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index a68dc56bdfba..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { OptionalAlias } from "./OptionalAlias.js"; - -const _DoubleOptional_Schema = z.object({ - optionalAlias: OptionalAlias._schema.optional(), -}); -export const DoubleOptional: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.DoubleOptional; - json: (parsed: SeedExhaustive.types.DoubleOptional) => serializers.types.DoubleOptional.Raw; -} = { - _schema: _DoubleOptional_Schema, - parse: (raw: unknown) => _DoubleOptional_Schema.parse(raw) as SeedExhaustive.types.DoubleOptional, - json: (parsed: SeedExhaustive.types.DoubleOptional) => - ({ - optionalAlias: - parsed.optionalAlias != null - ? parsed.optionalAlias != null - ? OptionalAlias.json(parsed.optionalAlias) - : parsed.optionalAlias - : parsed.optionalAlias, - }) as serializers.types.DoubleOptional.Raw, -}; - -export declare namespace DoubleOptional { - export interface Raw { - optionalAlias?: (OptionalAlias.Raw | undefined) | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index c90be8618d11..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,44 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -const _NestedObjectWithOptionalField_Schema = z - .object({ - string: z.string().optional(), - NestedObject: ObjectWithOptionalField._schema.optional(), - }) - .transform((data) => ({ - string: data.string, - nestedObject: data.NestedObject, - })); -export const NestedObjectWithOptionalField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithOptionalField; - json: ( - parsed: SeedExhaustive.types.NestedObjectWithOptionalField, - ) => serializers.types.NestedObjectWithOptionalField.Raw; -} = { - _schema: _NestedObjectWithOptionalField_Schema, - parse: (raw: unknown) => - _NestedObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithOptionalField, - json: (parsed: SeedExhaustive.types.NestedObjectWithOptionalField) => - ({ - string: parsed.string, - NestedObject: - parsed.nestedObject != null - ? parsed.nestedObject != null - ? ObjectWithOptionalField.json(parsed.nestedObject) - : parsed.nestedObject - : parsed.nestedObject, - }) as serializers.types.NestedObjectWithOptionalField.Raw, -}; - -export declare namespace NestedObjectWithOptionalField { - export interface Raw { - string?: string | null; - NestedObject?: ObjectWithOptionalField.Raw | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index ef7b8353d527..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -const _NestedObjectWithRequiredField_Schema = z - .object({ - string: z.string(), - NestedObject: ObjectWithOptionalField._schema, - }) - .transform((data) => ({ - string: data.string, - nestedObject: data.NestedObject, - })); -export const NestedObjectWithRequiredField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField; - json: ( - parsed: SeedExhaustive.types.NestedObjectWithRequiredField, - ) => serializers.types.NestedObjectWithRequiredField.Raw; -} = { - _schema: _NestedObjectWithRequiredField_Schema, - parse: (raw: unknown) => - _NestedObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField, - json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField) => - ({ - string: parsed.string, - NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), - }) as serializers.types.NestedObjectWithRequiredField.Raw, -}; - -export declare namespace NestedObjectWithRequiredField { - export interface Raw { - string: string; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index 714c7594bacd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithMapOfMap_Schema = z.object({ - map: z.record(z.string(), z.record(z.string(), z.string())), -}); -export const ObjectWithMapOfMap: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithMapOfMap; - json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => serializers.types.ObjectWithMapOfMap.Raw; -} = { - _schema: _ObjectWithMapOfMap_Schema, - parse: (raw: unknown) => _ObjectWithMapOfMap_Schema.parse(raw) as SeedExhaustive.types.ObjectWithMapOfMap, - json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => parsed as serializers.types.ObjectWithMapOfMap.Raw, -}; - -export declare namespace ObjectWithMapOfMap { - export interface Raw { - map: Record>; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 29084d0e7dc7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,74 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithOptionalField_Schema = z.object({ - string: z.string().optional(), - integer: z.number().optional(), - long: z.number().optional(), - double: z.number().optional(), - bool: z.boolean().optional(), - datetime: z - .string() - .transform((s) => new Date(s)) - .optional(), - date: z.string().optional(), - uuid: z.string().optional(), - base64: z.string().optional(), - list: z.array(z.string()).optional(), - set: z - .array(z.string()) - .transform((arr) => new Set(arr)) - .optional(), - map: z.record(z.string(), z.string()).optional(), - bigint: z.string().optional(), -}); -export const ObjectWithOptionalField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithOptionalField; - json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => serializers.types.ObjectWithOptionalField.Raw; -} = { - _schema: _ObjectWithOptionalField_Schema, - parse: (raw: unknown) => _ObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithOptionalField, - json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => - ({ - string: parsed.string, - integer: parsed.integer, - long: parsed.long, - double: parsed.double, - bool: parsed.bool, - datetime: - parsed.datetime != null - ? parsed.datetime != null - ? parsed.datetime.toISOString() - : parsed.datetime - : parsed.datetime, - date: parsed.date, - uuid: parsed.uuid, - base64: parsed.base64, - list: parsed.list, - set: parsed.set != null ? (parsed.set != null ? Array.from(parsed.set) : parsed.set) : parsed.set, - map: parsed.map, - bigint: parsed.bigint, - }) as serializers.types.ObjectWithOptionalField.Raw, -}; - -export declare namespace ObjectWithOptionalField { - export interface Raw { - string?: string | null; - integer?: number | null; - long?: number | null; - double?: number | null; - bool?: boolean | null; - datetime?: string | null; - date?: string | null; - uuid?: string | null; - base64?: string | null; - list?: string[] | null; - set?: string[] | null; - map?: Record | null; - bigint?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index a721771913f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,25 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _ObjectWithRequiredField_Schema = z.object({ - string: z.string(), -}); -export const ObjectWithRequiredField: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField; - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => serializers.types.ObjectWithRequiredField.Raw; -} = { - _schema: _ObjectWithRequiredField_Schema, - parse: (raw: unknown) => _ObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField, - json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => - parsed as serializers.types.ObjectWithRequiredField.Raw, -}; - -export declare namespace ObjectWithRequiredField { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index a243622f1ee5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _OptionalAlias_Schema = z.string().optional(); -export const OptionalAlias: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.OptionalAlias; - json: (parsed: SeedExhaustive.types.OptionalAlias) => serializers.types.OptionalAlias.Raw; -} = { - _schema: _OptionalAlias_Schema, - parse: (raw: unknown) => _OptionalAlias_Schema.parse(raw) as SeedExhaustive.types.OptionalAlias, - json: (parsed: SeedExhaustive.types.OptionalAlias) => parsed as serializers.types.OptionalAlias.Raw, -}; - -export declare namespace OptionalAlias { - export type Raw = string | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index 91b493ad4f9a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Cat } from "./Cat.js"; -import { Dog } from "./Dog.js"; - -const _Animal_Schema = z - .discriminatedUnion("animal", [ - z.object({ animal: z.literal("dog") }).merge(Dog._schema as z.AnyZodObject), - z.object({ animal: z.literal("cat") }).merge(Cat._schema as z.AnyZodObject), - ]) - .transform((value) => value); -export const Animal: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.Animal; - json: (parsed: SeedExhaustive.types.Animal) => serializers.types.Animal.Raw; -} = { - _schema: _Animal_Schema, - parse: (raw: unknown) => _Animal_Schema.parse(raw) as SeedExhaustive.types.Animal, - json: (parsed: SeedExhaustive.types.Animal) => parsed as serializers.types.Animal.Raw, -}; - -export declare namespace Animal { - export type Raw = Animal.Dog | Animal.Cat; - - export interface Dog extends Dog.Raw { - animal: "dog"; - } - - export interface Cat extends Cat.Raw { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index 0d6da57ce642..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _Cat_Schema = z.object({ - name: z.string(), - likesToMeow: z.boolean(), -}); -export const Cat: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.Cat; - json: (parsed: SeedExhaustive.types.Cat) => serializers.types.Cat.Raw; -} = { - _schema: _Cat_Schema, - parse: (raw: unknown) => _Cat_Schema.parse(raw) as SeedExhaustive.types.Cat, - json: (parsed: SeedExhaustive.types.Cat) => parsed as serializers.types.Cat.Raw, -}; - -export declare namespace Cat { - export interface Raw { - name: string; - likesToMeow: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 0547a8bc7e85..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { z } from "zod"; -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as serializers from "../../../../../index.js"; - -const _Dog_Schema = z.object({ - name: z.string(), - likesToWoof: z.boolean(), -}); -export const Dog: { - _schema: z.ZodTypeAny; - parse: (raw: unknown) => SeedExhaustive.types.Dog; - json: (parsed: SeedExhaustive.types.Dog) => serializers.types.Dog.Raw; -} = { - _schema: _Dog_Schema, - parse: (raw: unknown) => _Dog_Schema.parse(raw) as SeedExhaustive.types.Dog, - json: (parsed: SeedExhaustive.types.Dog) => parsed as serializers.types.Dog.Raw, -}; - -export declare namespace Dog { - export interface Raw { - name: string; - likesToWoof: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts deleted file mode 100644 index b643a3e3ea27..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts +++ /dev/null @@ -1 +0,0 @@ -export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts deleted file mode 100644 index 7f5e031c8396..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This is a custom test file, if you wish to add more tests - * to your SDK. - * Be sure to mark this file in `.fernignore`. - * - * If you include example requests/responses in your fern definition, - * you will have tests automatically generated for you. - */ -describe("test", () => { - it("default", () => { - expect(true).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts deleted file mode 100644 index 954872157d52..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { RequestHandlerOptions } from "msw"; -import type { SetupServer } from "msw/node"; - -import { mockEndpointBuilder } from "./mockEndpointBuilder"; - -export interface MockServerOptions { - baseUrl: string; - server: SetupServer; -} - -export class MockServer { - private readonly server: SetupServer; - public readonly baseUrl: string; - - constructor({ baseUrl, server }: MockServerOptions) { - this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; - this.server = server; - } - - public mockEndpoint(options?: RequestHandlerOptions): ReturnType { - const builder = mockEndpointBuilder({ - once: options?.once ?? true, - onBuild: (handler) => { - this.server.use(handler); - }, - }).baseUrl(this.baseUrl); - return builder; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts deleted file mode 100644 index e1a90f7fb2e3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { setupServer } from "msw/node"; - -import { fromJson, toJson } from "../../src/core/json"; -import { MockServer } from "./MockServer"; -import { randomBaseUrl } from "./randomBaseUrl"; - -const mswServer = setupServer(); -interface MockServerOptions { - baseUrl?: string; -} - -async function formatHttpRequest(request: Request, id?: string): Promise { - try { - const clone = request.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Request ${id} ###\n` : ""; - const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting request: ${e}`; - } -} - -async function formatHttpResponse(response: Response, id?: string): Promise { - try { - const clone = response.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Response for ${id} ###\n` : ""; - const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting response: ${e}`; - } -} - -class MockServerPool { - private servers: MockServer[] = []; - - public createServer(options?: Partial): MockServer { - const baseUrl = options?.baseUrl || randomBaseUrl(); - const server = new MockServer({ baseUrl, server: mswServer }); - this.servers.push(server); - return server; - } - - public getServers(): MockServer[] { - return [...this.servers]; - } - - public listen(): void { - const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; - mswServer.listen({ onUnhandledRequest }); - - if (process.env.LOG_LEVEL === "debug") { - mswServer.events.on("request:start", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:start\n${formattedRequest}`); - }); - - mswServer.events.on("request:unhandled", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:unhandled\n${formattedRequest}`); - }); - - mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { - const formattedResponse = await formatHttpResponse(response, requestId); - console.debug(`response:mocked\n${formattedResponse}`); - }); - } - } - - public close(): void { - this.servers = []; - mswServer.close(); - } -} - -export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts deleted file mode 100644 index 1b0e51079e6b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; - -import { url } from "../../src/core"; -import { toJson } from "../../src/core/json"; -import { withFormUrlEncoded } from "./withFormUrlEncoded"; -import { withHeaders } from "./withHeaders"; -import { withJson } from "./withJson"; - -type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; - -interface MethodStage { - baseUrl(baseUrl: string): MethodStage; - all(path: string): RequestHeadersStage; - get(path: string): RequestHeadersStage; - post(path: string): RequestHeadersStage; - put(path: string): RequestHeadersStage; - delete(path: string): RequestHeadersStage; - patch(path: string): RequestHeadersStage; - options(path: string): RequestHeadersStage; - head(path: string): RequestHeadersStage; -} - -interface RequestHeadersStage extends RequestBodyStage, ResponseStage { - header(name: string, value: string): RequestHeadersStage; - headers(headers: Record): RequestBodyStage; -} - -interface RequestBodyStage extends ResponseStage { - jsonBody(body: unknown): ResponseStage; - formUrlEncodedBody(body: unknown): ResponseStage; -} - -interface ResponseStage { - respondWith(): ResponseStatusStage; -} -interface ResponseStatusStage { - statusCode(statusCode: number): ResponseHeaderStage; -} - -interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { - header(name: string, value: string): ResponseHeaderStage; - headers(headers: Record): ResponseHeaderStage; -} - -interface ResponseBodyStage { - jsonBody(body: unknown): BuildStage; -} - -interface BuildStage { - build(): HttpHandler; -} - -export interface HttpHandlerBuilderOptions { - onBuild?: (handler: HttpHandler) => void; - once?: boolean; -} - -class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { - private method: HttpMethod = "get"; - private _baseUrl: string = ""; - private path: string = "/"; - private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - constructor(options?: HttpHandlerBuilderOptions) { - this.handlerOptions = options; - } - - baseUrl(baseUrl: string): MethodStage { - this._baseUrl = baseUrl; - return this; - } - - all(path: string): RequestHeadersStage { - this.method = "all"; - this.path = path; - return this; - } - - get(path: string): RequestHeadersStage { - this.method = "get"; - this.path = path; - return this; - } - - post(path: string): RequestHeadersStage { - this.method = "post"; - this.path = path; - return this; - } - - put(path: string): RequestHeadersStage { - this.method = "put"; - this.path = path; - return this; - } - - delete(path: string): RequestHeadersStage { - this.method = "delete"; - this.path = path; - return this; - } - - patch(path: string): RequestHeadersStage { - this.method = "patch"; - this.path = path; - return this; - } - - options(path: string): RequestHeadersStage { - this.method = "options"; - this.path = path; - return this; - } - - head(path: string): RequestHeadersStage { - this.method = "head"; - this.path = path; - return this; - } - - header(name: string, value: string): RequestHeadersStage { - this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); - return this; - } - - headers(headers: Record): RequestBodyStage { - this.predicates.push((resolver) => withHeaders(headers, resolver)); - return this; - } - - jsonBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); - } - this.predicates.push((resolver) => withJson(body, resolver)); - return this; - } - - formUrlEncodedBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error( - "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", - ); - } - this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); - return this; - } - - respondWith(): ResponseStatusStage { - return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); - } - - private buildUrl(): string { - return url.join(this._baseUrl, this.path); - } -} - -class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { - private readonly method: HttpMethod; - private readonly url: string; - private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - private responseStatusCode: number = 200; - private responseHeaders: Record = {}; - private responseBody: DefaultBodyType = undefined; - - constructor( - method: HttpMethod, - url: string, - requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], - options?: HttpHandlerBuilderOptions, - ) { - this.method = method; - this.url = url; - this.requestPredicates = requestPredicates; - this.handlerOptions = options; - } - - public statusCode(code: number): ResponseHeaderStage { - this.responseStatusCode = code; - return this; - } - - public header(name: string, value: string): ResponseHeaderStage { - this.responseHeaders[name] = value; - return this; - } - - public headers(headers: Record): ResponseHeaderStage { - this.responseHeaders = { ...this.responseHeaders, ...headers }; - return this; - } - - public jsonBody(body: unknown): BuildStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); - } - this.responseBody = toJson(body); - return this; - } - - public build(): HttpHandler { - const responseResolver: HttpResponseResolver = () => { - const response = new HttpResponse(this.responseBody, { - status: this.responseStatusCode, - headers: this.responseHeaders, - }); - // if no Content-Type header is set, delete the default text content type that is set - if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { - response.headers.delete("Content-Type"); - } - return response; - }; - - const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); - - const handler = http[this.method](this.url, finalResolver, this.handlerOptions); - this.handlerOptions?.onBuild?.(handler); - return handler; - } -} - -export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { - return new RequestBuilder(options); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts deleted file mode 100644 index 031aa6408aca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function randomBaseUrl(): string { - const randomString = Math.random().toString(36).substring(2, 15); - return `http://${randomString}.localhost`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts deleted file mode 100644 index aeb3a95af7dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { afterAll, beforeAll } from "vitest"; - -import { mockServerPool } from "./MockServerPool"; - -beforeAll(() => { - mockServerPool.listen(); -}); -afterAll(() => { - mockServerPool.close(); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts deleted file mode 100644 index e9e6ff2d9cf1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: Record; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a form-urlencoded body."); - return passthrough(); - } - const params = new URLSearchParams(bodyText); - actualBody = {}; - for (const [key, value] of params.entries()) { - actualBody[key] = value; - } - } catch (error) { - console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).length > 0) { - console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - return { value: { actual, expected } }; - } - return {}; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if (actual[key] !== expected[key]) { - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts deleted file mode 100644 index 6599d2b4a92d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -/** - * Creates a request matcher that validates if request headers match specified criteria - * @param expectedHeaders - Headers to match against - * @param resolver - Response resolver to execute if headers match - */ -export function withHeaders( - expectedHeaders: Record boolean)>, - resolver: HttpResponseResolver, -): HttpResponseResolver { - return (args) => { - const { request } = args; - const { headers } = request; - - const mismatches: Record< - string, - { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } - > = {}; - - for (const [key, expectedValue] of Object.entries(expectedHeaders)) { - const actualValue = headers.get(key); - - if (actualValue === null) { - mismatches[key] = { actual: null, expected: expectedValue }; - continue; - } - - if (typeof expectedValue === "function") { - if (!expectedValue(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue instanceof RegExp) { - if (!expectedValue.test(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue !== actualValue) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } - - if (Object.keys(mismatches).length > 0) { - const formattedMismatches = formatHeaderMismatches(mismatches); - console.error("Header mismatch:", formattedMismatches); - return passthrough(); - } - - return resolver(args); - }; -} - -function formatHeaderMismatches( - mismatches: Record boolean) }>, -): Record { - const formatted: Record = {}; - - for (const [key, { actual, expected }] of Object.entries(mismatches)) { - formatted[key] = { - actual, - expected: - expected instanceof RegExp - ? expected.toString() - : typeof expected === "function" - ? "[Function]" - : expected, - }; - } - - return formatted; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts deleted file mode 100644 index b627638b015f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { fromJson, toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request JSON body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: unknown; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a JSON object."); - return passthrough(); - } - actualBody = fromJson(bodyText); - } catch (error) { - console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { - console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - return {}; - } - - if (Array.isArray(actual) && Array.isArray(expected)) { - if (actual.length !== expected.length) { - return { length: { actual: actual.length, expected: expected.length } }; - } - - const arrayMismatches: Record = {}; - for (let i = 0; i < actual.length; i++) { - const itemMismatches = findMismatches(actual[i], expected[i]); - if (Object.keys(itemMismatches).length > 0) { - for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { - arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; - } - } - } - return arrayMismatches; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; // Skip undefined values in actual - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; // Skip undefined values in expected - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if ( - typeof actual[key] === "object" && - actual[key] !== null && - typeof expected[key] === "object" && - expected[key] !== null - ) { - const nestedMismatches = findMismatches(actual[key], expected[key]); - if (Object.keys(nestedMismatches).length > 0) { - for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { - mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; - } - } - } else if (actual[key] !== expected[key]) { - if (areEquivalent(actual[key], expected[key])) { - continue; - } - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} - -function areEquivalent(actual: unknown, expected: unknown): boolean { - if (actual === expected) { - return true; - } - if (isEquivalentBigInt(actual, expected)) { - return true; - } - if (isEquivalentDatetime(actual, expected)) { - return true; - } - return false; -} - -function isEquivalentBigInt(actual: unknown, expected: unknown) { - if (typeof actual === "number") { - actual = BigInt(actual); - } - if (typeof expected === "number") { - expected = BigInt(expected); - } - if (typeof actual === "bigint" && typeof expected === "bigint") { - return actual === expected; - } - return false; -} - -function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { - if (typeof str1 !== "string" || typeof str2 !== "string") { - return false; - } - const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; - if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { - return false; - } - - try { - const date1 = new Date(str1).getTime(); - const date2 = new Date(str2).getTime(); - return date1 === date2; - } catch { - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts deleted file mode 100644 index a5651f81ba10..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { expect } from "vitest"; - -interface CustomMatchers { - toContainHeaders(expectedHeaders: Record): R; -} - -declare module "vitest" { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} - -expect.extend({ - toContainHeaders(actual: unknown, expectedHeaders: Record) { - const isHeaders = actual instanceof Headers; - const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); - - if (!isHeaders && !isPlainObject) { - throw new TypeError("Received value must be an instance of Headers or a plain object!"); - } - - if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { - throw new TypeError("Expected headers must be a plain object!"); - } - - const missingHeaders: string[] = []; - const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; - - for (const [key, value] of Object.entries(expectedHeaders)) { - let actualValue: string | null = null; - - if (isHeaders) { - // Headers.get() is already case-insensitive - actualValue = (actual as Headers).get(key); - } else { - // For plain objects, do case-insensitive lookup - const actualObj = actual as Record; - const lowerKey = key.toLowerCase(); - const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); - actualValue = foundKey ? actualObj[foundKey] : null; - } - - if (actualValue === null || actualValue === undefined) { - missingHeaders.push(key); - } else if (actualValue !== value) { - mismatchedHeaders.push({ key, expected: value, actual: actualValue }); - } - } - - const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; - - const actualType = isHeaders ? "Headers" : "object"; - - if (pass) { - return { - message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, - pass: true, - }; - } else { - const messages: string[] = []; - - if (missingHeaders.length > 0) { - messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); - } - - if (mismatchedHeaders.length > 0) { - const mismatches = mismatchedHeaders.map( - ({ key, expected, actual }) => - `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, - ); - messages.push(mismatches.join("\n")); - } - - return { - message: () => - `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, - pass: false, - }; - } - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json deleted file mode 100644 index a477df47920c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": null, - "rootDir": "..", - "baseUrl": "..", - "types": ["vitest/globals"] - }, - "include": ["../src", "../tests"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts deleted file mode 100644 index 9b5123364c47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { BasicAuth } from "../../../src/core/auth/BasicAuth"; - -describe("BasicAuth", () => { - interface ToHeaderTestCase { - description: string; - input: { username: string; password: string }; - expected: string; - } - - interface FromHeaderTestCase { - description: string; - input: string; - expected: { username: string; password: string }; - } - - interface ErrorTestCase { - description: string; - input: string; - expectedError: string; - } - - describe("toAuthorizationHeader", () => { - const toHeaderTests: ToHeaderTestCase[] = [ - { - description: "correctly converts to header", - input: { username: "username", password: "password" }, - expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - }, - ]; - - toHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); - }); - }); - }); - - describe("fromAuthorizationHeader", () => { - const fromHeaderTests: FromHeaderTestCase[] = [ - { - description: "correctly parses header", - input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - expected: { username: "username", password: "password" }, - }, - { - description: "handles password with colons", - input: "Basic dXNlcjpwYXNzOndvcmQ=", - expected: { username: "user", password: "pass:word" }, - }, - { - description: "handles empty username and password (just colon)", - input: "Basic Og==", - expected: { username: "", password: "" }, - }, - { - description: "handles empty username", - input: "Basic OnBhc3N3b3Jk", - expected: { username: "", password: "password" }, - }, - { - description: "handles empty password", - input: "Basic dXNlcm5hbWU6", - expected: { username: "username", password: "" }, - }, - ]; - - fromHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); - }); - }); - - const errorTests: ErrorTestCase[] = [ - { - description: "throws error for completely empty credentials", - input: "Basic ", - expectedError: "Invalid basic auth", - }, - { - description: "throws error for credentials without colon", - input: "Basic dXNlcm5hbWU=", - expectedError: "Invalid basic auth", - }, - ]; - - errorTests.forEach(({ description, input, expectedError }) => { - it(description, () => { - expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts deleted file mode 100644 index 7757b87cb97e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BearerToken } from "../../../src/core/auth/BearerToken"; - -describe("BearerToken", () => { - describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); - }); - }); - describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts deleted file mode 100644 index 939594ca277b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { base64Decode, base64Encode } from "../../src/core/base64"; - -describe("base64", () => { - describe("base64Encode", () => { - it("should encode ASCII strings", () => { - expect(base64Encode("hello")).toBe("aGVsbG8="); - expect(base64Encode("")).toBe(""); - }); - - it("should encode UTF-8 strings", () => { - expect(base64Encode("café")).toBe("Y2Fmw6k="); - expect(base64Encode("🎉")).toBe("8J+OiQ=="); - }); - - it("should handle basic auth credentials", () => { - expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); - }); - }); - - describe("base64Decode", () => { - it("should decode ASCII strings", () => { - expect(base64Decode("aGVsbG8=")).toBe("hello"); - expect(base64Decode("")).toBe(""); - }); - - it("should decode UTF-8 strings", () => { - expect(base64Decode("Y2Fmw6k=")).toBe("café"); - expect(base64Decode("8J+OiQ==")).toBe("🎉"); - }); - - it("should handle basic auth credentials", () => { - expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); - }); - }); - - describe("round-trip encoding", () => { - const testStrings = [ - "hello world", - "test@example.com", - "café", - "username:password", - "user@domain.com:super$ecret123!", - ]; - - testStrings.forEach((testString) => { - it(`should round-trip encode/decode: "${testString}"`, () => { - const encoded = base64Encode(testString); - const decoded = base64Decode(encoded); - expect(decoded).toBe(testString); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts deleted file mode 100644 index 60df2b5e4824..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts +++ /dev/null @@ -1,261 +0,0 @@ -import fs from "fs"; -import { join } from "path"; -import stream from "stream"; -import type { BinaryResponse } from "../../../src/core"; -import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -describe("Test fetcherImpl", () => { - it("should handle successful request", async () => { - const mockArgs: Fetcher.Args = { - url: "https://httpbin.org/post", - method: "POST", - headers: { "X-Test": "x-test-header" }, - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - maxRetries: 0, - responseType: "json", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - - expect(global.fetch).toHaveBeenCalledWith( - "https://httpbin.org/post", - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: JSON.stringify({ data: "test" }), - }), - ); - }); - - it("should send octet stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "POST", - headers: { "X-Test": "x-test-header" }, - contentType: "application/octet-stream", - requestType: "bytes", - maxRetries: 0, - responseType: "json", - body: fs.createReadStream(join(__dirname, "test-file.txt")), - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: expect.any(fs.ReadStream), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - }); - - it("should receive file as stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.stream).toBe("function"); - const stream = body.stream(); - expect(stream).toBeInstanceOf(ReadableStream); - const reader = stream.getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as blob", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.blob).toBe("function"); - const blob = await body.blob(); - expect(blob).toBeInstanceOf(Blob); - const reader = blob.stream().getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as arraybuffer", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.arrayBuffer).toBe("function"); - const arrayBuffer = await body.arrayBuffer(); - expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as bytes", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.bytes).toBe("function"); - if (!body.bytes) { - return; - } - const bytes = await body.bytes(); - expect(bytes).toBeInstanceOf(Uint8Array); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(bytes); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts deleted file mode 100644 index 2ec008e581d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; - -import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; -import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("HttpResponsePromise", () => { - const mockRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - const mockData = { id: "123", name: "test" }; - const mockWithRawResponse: WithRawResponse = { - data: mockData, - rawResponse: mockRawResponse, - }; - - describe("fromFunction", () => { - it("should create an HttpResponsePromise from a function", async () => { - const mockFn = vi - .fn<(arg1: string, arg2: string) => Promise>>() - .mockResolvedValue(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); - - const result = await responsePromise; - expect(result).toEqual(mockData); - expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromPromise", () => { - it("should create an HttpResponsePromise from a promise", async () => { - const promise = Promise.resolve(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromPromise(promise); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromExecutor", () => { - it("should create an HttpResponsePromise from an executor function", async () => { - const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { - resolve(mockWithRawResponse); - }); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromResult", () => { - it("should create an HttpResponsePromise from a result", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("Promise methods", () => { - let responsePromise: HttpResponsePromise; - - beforeEach(() => { - responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - }); - - it("should support then() method", async () => { - const result = await responsePromise.then((data) => ({ - ...data, - modified: true, - })); - - expect(result).toEqual({ - ...mockData, - modified: true, - }); - }); - - it("should support catch() method", async () => { - const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { - reject(new Error("Test error")); - }); - - const catchSpy = vi.fn(); - await errorResponsePromise.catch(catchSpy); - - expect(catchSpy).toHaveBeenCalled(); - const error = catchSpy.mock.calls[0]?.[0]; - expect(error).toBeInstanceOf(Error); - expect((error as Error).message).toBe("Test error"); - }); - - it("should support finally() method", async () => { - const finallySpy = vi.fn(); - await responsePromise.finally(finallySpy); - - expect(finallySpy).toHaveBeenCalled(); - }); - }); - - describe("withRawResponse", () => { - it("should return both data and raw response", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise.withRawResponse(); - - expect(result).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts deleted file mode 100644 index 375ee3f38064..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("RawResponse", () => { - describe("toRawResponse", () => { - it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { - const mockHeaders = new Headers({ "content-type": "application/json" }); - const mockResponse = { - body: "test body", - bodyUsed: false, - ok: true, - headers: mockHeaders, - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - - const result = toRawResponse(mockResponse as unknown as Response); - - expect("body" in result).toBe(false); - expect("bodyUsed" in result).toBe(false); - expect("ok" in result).toBe(false); - expect(result.headers).toBe(mockHeaders); - expect(result.redirected).toBe(false); - expect(result.status).toBe(200); - expect(result.statusText).toBe("OK"); - expect(result.type).toBe("basic"); - expect(result.url).toBe("https://example.com"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts deleted file mode 100644 index a92f1b5e81d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; - -describe("Test createRequestUrl", () => { - const BASE_URL = "https://api.example.com"; - - interface TestCase { - description: string; - baseUrl: string; - queryParams?: Record; - expected: string; - } - - const testCases: TestCase[] = [ - { - description: "should return the base URL when no query parameters are provided", - baseUrl: BASE_URL, - expected: BASE_URL, - }, - { - description: "should append simple query parameters", - baseUrl: BASE_URL, - queryParams: { key: "value", another: "param" }, - expected: "https://api.example.com?key=value&another=param", - }, - { - description: "should handle array query parameters", - baseUrl: BASE_URL, - queryParams: { items: ["a", "b", "c"] }, - expected: "https://api.example.com?items=a&items=b&items=c", - }, - { - description: "should handle object query parameters", - baseUrl: BASE_URL, - queryParams: { filter: { name: "John", age: 30 } }, - expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", - }, - { - description: "should handle mixed types of query parameters", - baseUrl: BASE_URL, - queryParams: { - simple: "value", - array: ["x", "y"], - object: { key: "value" }, - }, - expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", - }, - { - description: "should handle empty query parameters object", - baseUrl: BASE_URL, - queryParams: {}, - expected: BASE_URL, - }, - { - description: "should encode special characters in query parameters", - baseUrl: BASE_URL, - queryParams: { special: "a&b=c d" }, - expected: "https://api.example.com?special=a%26b%3Dc%20d", - }, - { - description: "should handle numeric values", - baseUrl: BASE_URL, - queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, - expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", - }, - { - description: "should handle boolean values", - baseUrl: BASE_URL, - queryParams: { enabled: true, disabled: false }, - expected: "https://api.example.com?enabled=true&disabled=false", - }, - { - description: "should handle null and undefined values", - baseUrl: BASE_URL, - queryParams: { - valid: "value", - nullValue: null, - undefinedValue: undefined, - emptyString: "", - }, - expected: "https://api.example.com?valid=value&nullValue=&emptyString=", - }, - { - description: "should handle deeply nested objects", - baseUrl: BASE_URL, - queryParams: { - user: { - profile: { - name: "John", - settings: { theme: "dark" }, - }, - }, - }, - expected: - "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle arrays of objects", - baseUrl: BASE_URL, - queryParams: { - users: [ - { name: "John", age: 30 }, - { name: "Jane", age: 25 }, - ], - }, - expected: - "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", - }, - { - description: "should handle mixed arrays", - baseUrl: BASE_URL, - queryParams: { - mixed: ["string", 42, true, { key: "value" }], - }, - expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", - }, - { - description: "should handle empty arrays", - baseUrl: BASE_URL, - queryParams: { emptyArray: [] }, - expected: BASE_URL, - }, - { - description: "should handle empty objects", - baseUrl: BASE_URL, - queryParams: { emptyObject: {} }, - expected: BASE_URL, - }, - { - description: "should handle special characters in keys", - baseUrl: BASE_URL, - queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, - expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", - }, - { - description: "should handle URL with existing query parameters", - baseUrl: "https://api.example.com?existing=param", - queryParams: { new: "value" }, - expected: "https://api.example.com?existing=param?new=value", - }, - { - description: "should handle complex nested structures", - baseUrl: BASE_URL, - queryParams: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - ]; - - testCases.forEach(({ description, baseUrl, queryParams, expected }) => { - it(description, () => { - expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts deleted file mode 100644 index 8a6c3a57e211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getRequestBody", () => { - interface TestCase { - description: string; - input: any; - type: "json" | "form" | "file" | "bytes" | "other"; - expected: any; - skipCondition?: () => boolean; - } - - const testCases: TestCase[] = [ - { - description: "should stringify body if not FormData in Node environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "node", - }, - { - description: "should stringify body if not FormData in browser environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "browser", - }, - { - description: "should return the Uint8Array", - input: new Uint8Array([1, 2, 3]), - type: "bytes", - expected: new Uint8Array([1, 2, 3]), - }, - { - description: "should serialize objects for form-urlencoded content type", - input: { username: "johndoe", email: "john@example.com" }, - type: "form", - expected: "username=johndoe&email=john%40example.com", - }, - { - description: "should serialize complex nested objects and arrays for form-urlencoded content type", - input: { - user: { - profile: { - name: "John Doe", - settings: { - theme: "dark", - notifications: true, - }, - }, - tags: ["admin", "user"], - contacts: [ - { type: "email", value: "john@example.com" }, - { type: "phone", value: "+1234567890" }, - ], - }, - filters: { - status: ["active", "pending"], - metadata: { - created: "2024-01-01", - categories: ["electronics", "books"], - }, - }, - preferences: ["notifications", "updates"], - }, - type: "form", - expected: - "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + - "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + - "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + - "user%5Btags%5D=admin&" + - "user%5Btags%5D=user&" + - "user%5Bcontacts%5D%5Btype%5D=email&" + - "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + - "user%5Bcontacts%5D%5Btype%5D=phone&" + - "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + - "filters%5Bstatus%5D=active&" + - "filters%5Bstatus%5D=pending&" + - "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + - "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + - "filters%5Bmetadata%5D%5Bcategories%5D=books&" + - "preferences=notifications&" + - "preferences=updates", - }, - { - description: "should return the input for pre-serialized form-urlencoded strings", - input: "key=value&another=param", - type: "other", - expected: "key=value&another=param", - }, - { - description: "should JSON stringify objects", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - }, - ]; - - testCases.forEach(({ description, input, type, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const result = await getRequestBody({ - body: input, - type, - }); - - if (input instanceof Uint8Array) { - expect(result).toBe(input); - } else { - expect(result).toBe(expected); - } - }); - }); - - it("should return FormData in browser environment", async () => { - if (RUNTIME.type === "browser") { - const formData = new FormData(); - formData.append("key", "value"); - const result = await getRequestBody({ - body: formData, - type: "file", - }); - expect(result).toBe(formData); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts deleted file mode 100644 index ad6be7fc2c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; - -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getResponseBody", () => { - interface SimpleTestCase { - description: string; - responseData: string | Record; - responseType?: "blob" | "sse" | "streaming" | "text"; - expected: any; - skipCondition?: () => boolean; - } - - const simpleTestCases: SimpleTestCase[] = [ - { - description: "should handle text response type", - responseData: "test text", - responseType: "text", - expected: "test text", - }, - { - description: "should handle JSON response", - responseData: { key: "value" }, - expected: { key: "value" }, - }, - { - description: "should handle empty response", - responseData: "", - expected: undefined, - }, - { - description: "should handle non-JSON response", - responseData: "invalid json", - expected: { - ok: false, - error: { - reason: "non-json", - statusCode: 200, - rawBody: "invalid json", - }, - }, - }, - ]; - - simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const mockResponse = new Response( - typeof responseData === "string" ? responseData : JSON.stringify(responseData), - ); - const result = await getResponseBody(mockResponse, responseType); - expect(result).toEqual(expected); - }); - }); - - it("should handle blob response type", async () => { - const mockBlob = new Blob(["test"], { type: "text/plain" }); - const mockResponse = new Response(mockBlob); - const result = await getResponseBody(mockResponse, "blob"); - // @ts-expect-error - expect(result.constructor.name).toBe("Blob"); - }); - - it("should handle sse response type", async () => { - if (RUNTIME.type === "node") { - const mockStream = new ReadableStream(); - const mockResponse = new Response(mockStream); - const result = await getResponseBody(mockResponse, "sse"); - expect(result).toBe(mockStream); - } - }); - - it("should handle streaming response type", async () => { - const encoder = new TextEncoder(); - const testData = "test stream data"; - const mockStream = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode(testData)); - controller.close(); - }, - }); - - const mockResponse = new Response(mockStream); - const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; - - expect(result).toBeInstanceOf(ReadableStream); - - const reader = result.getReader(); - const decoder = new TextDecoder(); - const { value } = await reader.read(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe(testData); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts deleted file mode 100644 index 366c9b6ced61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts +++ /dev/null @@ -1,517 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Fetcher Logging Integration", () => { - describe("Request Logging", () => { - it("should log successful request at debug level", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - headers: { "Content-Type": "application/json" }, - body: { test: "data" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - }), - hasBody: true, - }), - ); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - statusCode: 200, - }), - ); - }); - - it("should not log debug messages at info level for successful requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "info", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - }); - - it("should log request with body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: true, - }), - ); - }); - - it("should log request without body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: false, - }), - ); - }); - - it("should not log when silent mode is enabled", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: true, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should not log when no logging config is provided", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Error Logging", () => { - it("should log 4xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Not found" }, 404, "Not Found"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 404, - }), - ); - }); - - it("should log 5xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 500, - }), - ); - }); - - it("should log aborted request errors", async () => { - const mockLogger = createMockLogger(); - - const abortController = new AbortController(); - abortController.abort(); - - global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - abortSignal: abortController.signal, - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request was aborted", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - }), - ); - }); - - it("should log timeout errors", async () => { - const mockLogger = createMockLogger(); - - const timeoutError = new Error("Request timeout"); - timeoutError.name = "AbortError"; - - global.fetch = vi.fn().mockRejectedValue(timeoutError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request timed out", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - timeoutMs: undefined, - }), - ); - }); - - it("should log unknown errors", async () => { - const mockLogger = createMockLogger(); - - const unknownError = new Error("Unknown error"); - - global.fetch = vi.fn().mockRejectedValue(unknownError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - errorMessage: "Unknown error", - }), - ); - }); - }); - - describe("Logging with Redaction", () => { - it("should redact sensitive data in error logs", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]", - }), - ); - }); - }); - - describe("Different HTTP Methods", () => { - it("should log GET requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "GET", - }), - ); - }); - - it("should log POST requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - }), - ); - }); - - it("should log PUT requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "PUT", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "PUT", - }), - ); - }); - - it("should log DELETE requests", async () => { - const mockLogger = createMockLogger(); - global.fetch = vi.fn().mockResolvedValue( - new Response(null, { - status: 200, - statusText: "OK", - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "DELETE", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "DELETE", - }), - ); - }); - }); - - describe("Status Code Logging", () => { - it("should log 2xx success status codes", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 201, - }), - ); - }); - - it("should log 3xx redirect status codes as success", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 301, - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts deleted file mode 100644 index ea49466a55fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Mock } from "vitest"; -import { makeRequest } from "../../../src/core/fetcher/makeRequest"; - -describe("Test makeRequest", () => { - const mockPostUrl = "https://httpbin.org/post"; - const mockGetUrl = "https://httpbin.org/get"; - const mockHeaders = { "Content-Type": "application/json" }; - const mockBody = JSON.stringify({ key: "value" }); - - let mockFetch: Mock; - - beforeEach(() => { - mockFetch = vi.fn(); - mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); - }); - - it("should handle POST request correctly", async () => { - const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockPostUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "POST", - headers: mockHeaders, - body: mockBody, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); - - it("should handle GET request correctly", async () => { - const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockGetUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "GET", - headers: mockHeaders, - body: undefined, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts deleted file mode 100644 index d599376b9bcf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts +++ /dev/null @@ -1,1115 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Redacting Logic", () => { - describe("Header Redaction", () => { - it("should redact authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Authorization: "Bearer secret-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - }), - }), - ); - }); - - it("should redact api-key header (case-insensitive)", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-API-KEY": "secret-api-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-API-KEY": "[REDACTED]", - }), - }), - ); - }); - - it("should redact cookie header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Cookie: "session=abc123; token=xyz789" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Cookie: "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-auth-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "x-auth-token": "auth-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "x-auth-token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact proxy-authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "Proxy-Authorization": "Basic credentials" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Proxy-Authorization": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-csrf-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-CSRF-Token": "csrf-token-abc" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-CSRF-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact www-authenticate header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "WWW-Authenticate": "Bearer realm=example" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "WWW-Authenticate": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-session-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-Session-Token": "session-token-xyz" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-Session-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive headers", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }), - }), - ); - }); - - it("should redact multiple sensitive headers at once", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - Authorization: "Bearer token", - "X-API-Key": "api-key", - Cookie: "session=123", - "Content-Type": "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - "X-API-Key": "[REDACTED]", - Cookie: "[REDACTED]", - "Content-Type": "application/json", - }), - }), - ); - }); - }); - - describe("Response Header Redaction", () => { - it("should redact Set-Cookie in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "set-cookie": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact authorization in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Authorization", "Bearer token-123"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - authorization: "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact response headers in error responses", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - statusText: "Unauthorized", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "www-authenticate": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - }); - - describe("Query Parameter Redaction", () => { - it("should redact api_key query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { api_key: "secret-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - api_key: "[REDACTED]", - }), - }), - ); - }); - - it("should redact token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact access_token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { access_token: "secret-access-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - access_token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact password query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { password: "secret-password" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - password: "[REDACTED]", - }), - }), - ); - }); - - it("should redact secret query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { secret: "secret-value" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - secret: "[REDACTED]", - }), - }), - ); - }); - - it("should redact session_id query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { session_id: "session-123" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - session_id: "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - page: "1", - limit: "10", - sort: "name", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - page: "1", - limit: "10", - sort: "name", - }), - }), - ); - }); - - it("should not redact parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - author: "john", - authenticate: "false", - authorization_level: "user", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - author: "john", - authenticate: "false", - authorization_level: "user", - }), - }), - ); - }); - - it("should handle undefined query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: undefined, - }), - ); - }); - - it("should redact case-insensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - API_KEY: "[REDACTED]", - Token: "[REDACTED]", - }), - }), - ); - }); - }); - - describe("URL Redaction", () => { - it("should redact credentials in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:password@example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api", - }), - ); - }); - - it("should redact api_key in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret-key&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&page=1", - }), - ); - }); - - it("should redact token in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret-token", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should redact password in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?username=user&password=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?username=user&password=[REDACTED]", - }), - ); - }); - - it("should not redact non-sensitive query strings", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name", - }), - ); - }); - - it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - }), - ); - }); - - it("should handle URL with fragment", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret#section", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]#section", - }), - ); - }); - - it("should redact URL-encoded query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api%5Fkey=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api%5Fkey=[REDACTED]", - }), - ); - }); - - it("should handle URL without query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api", - }), - ); - }); - - it("should handle empty query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?", - }), - ); - }); - - it("should redact multiple sensitive parameters in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret1&token=secret2&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", - }), - ); - }); - - it("should redact both credentials and query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/api?token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should use fast path for URLs without sensitive keywords", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - }), - ); - }); - - it("should handle query parameter without value", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?flag&token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?flag&token=[REDACTED]", - }), - ); - }); - - it("should handle URL with multiple @ symbols in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user@example.com:pass@host.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@host.com/api", - }), - ); - }); - - it("should handle URL with @ in query parameter but not in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?email=user@example.com", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?email=user@example.com", - }), - ); - }); - - it("should handle URL with both credentials and @ in path", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/users/@username", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/users/@username", - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts deleted file mode 100644 index d22661367f4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -import type { Mock, MockInstance } from "vitest"; -import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; - -describe("requestWithRetries", () => { - let mockFetch: Mock; - let originalMathRandom: typeof Math.random; - let setTimeoutSpy: MockInstance; - - beforeEach(() => { - mockFetch = vi.fn(); - originalMathRandom = Math.random; - - Math.random = vi.fn(() => 0.5); - - vi.useFakeTimers({ - toFake: [ - "setTimeout", - "clearTimeout", - "setInterval", - "clearInterval", - "setImmediate", - "clearImmediate", - "Date", - "performance", - "requestAnimationFrame", - "cancelAnimationFrame", - "requestIdleCallback", - "cancelIdleCallback", - ], - }); - }); - - afterEach(() => { - Math.random = originalMathRandom; - vi.clearAllMocks(); - vi.clearAllTimers(); - }); - - it("should retry on retryable status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const retryableStatuses = [408, 429, 500, 502]; - let callCount = 0; - - mockFetch.mockImplementation(async () => { - if (callCount < retryableStatuses.length) { - return new Response("", { status: retryableStatuses[callCount++] }); - } - return new Response("", { status: 200 }); - }); - - const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); - expect(response.status).toBe(200); - }); - - it("should respect maxRetries limit", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const maxRetries = 2; - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - expect(response.status).toBe(500); - }); - - it("should not retry on success status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const successStatuses = [200, 201, 202]; - - for (const status of successStatuses) { - mockFetch.mockReset(); - setTimeoutSpy.mockClear(); - mockFetch.mockResolvedValueOnce(new Response("", { status })); - - const responsePromise = requestWithRetries(() => mockFetch(), 3); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(1); - expect(setTimeoutSpy).not.toHaveBeenCalled(); - } - }); - - interface RetryHeaderTestCase { - description: string; - headerName: string; - headerValue: string | (() => string); - expectedDelayMin: number; - expectedDelayMax: number; - } - - const retryHeaderTests: RetryHeaderTestCase[] = [ - { - description: "should respect retry-after header with seconds value", - headerName: "retry-after", - headerValue: "5", - expectedDelayMin: 4000, - expectedDelayMax: 6000, - }, - { - description: "should respect retry-after header with HTTP date value", - headerName: "retry-after", - headerValue: () => new Date(Date.now() + 3000).toUTCString(), - expectedDelayMin: 2000, - expectedDelayMax: 4000, - }, - { - description: "should respect x-ratelimit-reset header", - headerName: "x-ratelimit-reset", - headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), - expectedDelayMin: 3000, - expectedDelayMax: 6000, - }, - ]; - - retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { - it(description, async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const value = typeof headerValue === "function" ? headerValue() : headerValue; - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ [headerName]: value }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(expectedDelayMin); - expect(actualDelay).toBeLessThan(expectedDelayMax); - expect(response.status).toBe(200); - }); - }); - - it("should apply correct exponential backoff with jitter", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - const maxRetries = 3; - const expectedDelays = [1000, 2000, 4000]; - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); - - expectedDelays.forEach((delay, index) => { - expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); - }); - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - }); - - it("should handle concurrent retries independently", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 200 })) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const promise1 = requestWithRetries(() => mockFetch(), 1); - const promise2 = requestWithRetries(() => mockFetch(), 1); - - await vi.runAllTimersAsync(); - const [response1, response2] = await Promise.all([promise1, promise2]); - - expect(response1.status).toBe(200); - expect(response2.status).toBe(200); - }); - - it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); - expect(response.status).toBe(200); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts deleted file mode 100644 index d7b6d1e63caa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; - -describe("Test getTimeoutSignal", () => { - beforeEach(() => { - vi.useFakeTimers(); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - it("should return an object with signal and abortId", () => { - const { signal, abortId } = getTimeoutSignal(1000); - - expect(signal).toBeDefined(); - expect(abortId).toBeDefined(); - expect(signal).toBeInstanceOf(AbortSignal); - expect(signal.aborted).toBe(false); - }); - - it("should create a signal that aborts after the specified timeout", () => { - const timeoutMs = 5000; - const { signal } = getTimeoutSignal(timeoutMs); - - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(timeoutMs - 1); - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(1); - expect(signal.aborted).toBe(true); - }); -}); - -describe("Test anySignal", () => { - it("should return an AbortSignal", () => { - const signal = anySignal(new AbortController().signal); - expect(signal).toBeInstanceOf(AbortSignal); - }); - - it("should abort when any of the input signals is aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal(controller1.signal, controller2.signal); - - expect(signal.aborted).toBe(false); - controller1.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should handle an array of signals", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal([controller1.signal, controller2.signal]); - - expect(signal.aborted).toBe(false); - controller2.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should abort immediately if one of the input signals is already aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - controller1.abort(); - - const signal = anySignal(controller1.signal, controller2.signal); - expect(signal.aborted).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt deleted file mode 100644 index c66d471e359c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts deleted file mode 100644 index 2e0b5fe5040c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts +++ /dev/null @@ -1,454 +0,0 @@ -import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -describe("Logger", () => { - describe("LogLevel", () => { - it("should have correct log levels", () => { - expect(LogLevel.Debug).toBe("debug"); - expect(LogLevel.Info).toBe("info"); - expect(LogLevel.Warn).toBe("warn"); - expect(LogLevel.Error).toBe("error"); - }); - }); - - describe("ConsoleLogger", () => { - let consoleLogger: ConsoleLogger; - let consoleSpy: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - consoleLogger = new ConsoleLogger(); - consoleSpy = { - debug: vi.spyOn(console, "debug").mockImplementation(() => {}), - info: vi.spyOn(console, "info").mockImplementation(() => {}), - warn: vi.spyOn(console, "warn").mockImplementation(() => {}), - error: vi.spyOn(console, "error").mockImplementation(() => {}), - }; - }); - - afterEach(() => { - consoleSpy.debug.mockRestore(); - consoleSpy.info.mockRestore(); - consoleSpy.warn.mockRestore(); - consoleSpy.error.mockRestore(); - }); - - it("should log debug messages", () => { - consoleLogger.debug("debug message", { data: "test" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); - }); - - it("should log info messages", () => { - consoleLogger.info("info message", { data: "test" }); - expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); - }); - - it("should log warn messages", () => { - consoleLogger.warn("warn message", { data: "test" }); - expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); - }); - - it("should log error messages", () => { - consoleLogger.error("error message", { data: "test" }); - expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); - }); - - it("should handle multiple arguments", () => { - consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); - }); - }); - - describe("Logger with level filtering", () => { - let mockLogger: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - mockLogger = createMockLogger(); - }); - - describe("Debug level", () => { - it("should log all levels when set to debug", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).toHaveBeenCalledWith("debug"); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(true); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Info level", () => { - it("should log info, warn, and error when set to info", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Warn level", () => { - it("should log warn and error when set to warn", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Error level", () => { - it("should only log error when set to error", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Silent mode", () => { - it("should not log anything when silent is true", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should report all level checks as false when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(false); - }); - }); - - describe("shouldLog", () => { - it("should correctly determine if level should be logged", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(true); - expect(logger.shouldLog(LogLevel.Warn)).toBe(true); - expect(logger.shouldLog(LogLevel.Error)).toBe(true); - }); - - it("should return false for all levels when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - expect(logger.shouldLog(LogLevel.Warn)).toBe(false); - expect(logger.shouldLog(LogLevel.Error)).toBe(false); - }); - }); - - describe("Multiple arguments", () => { - it("should pass multiple arguments to logger", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message", "arg1", { key: "value" }, 123); - expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); - }); - }); - }); - - describe("createLogger", () => { - it("should return default logger when no config provided", () => { - const logger = createLogger(); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should return same logger instance when Logger is passed", () => { - const customLogger = new Logger({ - level: LogLevel.Debug, - logger: new ConsoleLogger(), - silent: false, - }); - - const result = createLogger(customLogger); - expect(result).toBe(customLogger); - }); - - it("should create logger with custom config", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger).toBeInstanceOf(Logger); - logger.warn("test"); - expect(mockLogger.warn).toHaveBeenCalledWith("test"); - }); - - it("should use default values for missing config", () => { - const logger = createLogger({}); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should override default level", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("test"); - expect(mockLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should override default silent mode", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - silent: false, - }); - - logger.info("test"); - expect(mockLogger.info).toHaveBeenCalledWith("test"); - }); - - it("should use provided logger implementation", () => { - const customLogger = createMockLogger(); - - const logger = createLogger({ - logger: customLogger, - level: LogLevel.Debug, - silent: false, - }); - - logger.debug("test"); - expect(customLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should default to silent: true", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - level: LogLevel.Debug, - }); - - logger.debug("test"); - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Default logger", () => { - it("should have silent: true by default", () => { - const logger = createLogger(); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - }); - - it("should not log when using default logger", () => { - const logger = createLogger(); - - logger.info("test"); - expect(logger.isInfo()).toBe(false); - }); - }); - - describe("Edge cases", () => { - it("should handle empty message", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug(""); - expect(mockLogger.debug).toHaveBeenCalledWith(""); - }); - - it("should handle no arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message"); - expect(mockLogger.debug).toHaveBeenCalledWith("message"); - }); - - it("should handle complex objects", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - const complexObject = { - nested: { key: "value" }, - array: [1, 2, 3], - fn: () => "test", - }; - - logger.debug("message", complexObject); - expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); - }); - - it("should handle errors as arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - const error = new Error("Test error"); - logger.error("Error occurred", error); - expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts deleted file mode 100644 index 123488f084ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { join } from "../../../src/core/url/index"; - -describe("join", () => { - interface TestCase { - description: string; - base: string; - segments: string[]; - expected: string; - } - - describe("basic functionality", () => { - const basicTests: TestCase[] = [ - { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, - { - description: "should return empty string for empty base with path", - base: "", - segments: ["path"], - expected: "", - }, - { - description: "should handle single segment", - base: "base", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with trailing slash on base", - base: "base/", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with leading slash", - base: "base", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with both slashes", - base: "base/", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle multiple segments", - base: "base", - segments: ["path1", "path2", "path3"], - expected: "base/path1/path2/path3", - }, - { - description: "should handle multiple segments with slashes", - base: "base/", - segments: ["/path1/", "/path2/", "/path3/"], - expected: "base/path1/path2/path3/", - }, - ]; - - basicTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("URL handling", () => { - const urlTests: TestCase[] = [ - { - description: "should handle absolute URLs", - base: "https://example.com", - segments: ["api", "v1"], - expected: "https://example.com/api/v1", - }, - { - description: "should handle absolute URLs with slashes", - base: "https://example.com/", - segments: ["/api/", "/v1/"], - expected: "https://example.com/api/v1/", - }, - { - description: "should handle absolute URLs with base path", - base: "https://example.com/base", - segments: ["api", "v1"], - expected: "https://example.com/base/api/v1", - }, - { - description: "should preserve URL query parameters", - base: "https://example.com?query=1", - segments: ["api"], - expected: "https://example.com/api?query=1", - }, - { - description: "should preserve URL fragments", - base: "https://example.com#fragment", - segments: ["api"], - expected: "https://example.com/api#fragment", - }, - { - description: "should preserve URL query and fragments", - base: "https://example.com?query=1#fragment", - segments: ["api"], - expected: "https://example.com/api?query=1#fragment", - }, - { - description: "should handle http protocol", - base: "http://example.com", - segments: ["api"], - expected: "http://example.com/api", - }, - { - description: "should handle ftp protocol", - base: "ftp://example.com", - segments: ["files"], - expected: "ftp://example.com/files", - }, - { - description: "should handle ws protocol", - base: "ws://example.com", - segments: ["socket"], - expected: "ws://example.com/socket", - }, - { - description: "should fallback to path joining for malformed URLs", - base: "not-a-url://", - segments: ["path"], - expected: "not-a-url:///path", - }, - ]; - - urlTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("edge cases", () => { - const edgeCaseTests: TestCase[] = [ - { - description: "should handle empty segments", - base: "base", - segments: ["", "path"], - expected: "base/path", - }, - { - description: "should handle null segments", - base: "base", - segments: [null as any, "path"], - expected: "base/path", - }, - { - description: "should handle undefined segments", - base: "base", - segments: [undefined as any, "path"], - expected: "base/path", - }, - { - description: "should handle segments with only single slash", - base: "base", - segments: ["/", "path"], - expected: "base/path", - }, - { - description: "should handle segments with only double slash", - base: "base", - segments: ["//", "path"], - expected: "base/path", - }, - { - description: "should handle base paths with trailing slashes", - base: "base/", - segments: ["path"], - expected: "base/path", - }, - { - description: "should handle complex nested paths", - base: "api/v1/", - segments: ["/users/", "/123/", "/profile"], - expected: "api/v1/users/123/profile", - }, - ]; - - edgeCaseTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("real-world scenarios", () => { - const realWorldTests: TestCase[] = [ - { - description: "should handle API endpoint construction", - base: "https://api.example.com/v1", - segments: ["users", "123", "posts"], - expected: "https://api.example.com/v1/users/123/posts", - }, - { - description: "should handle file path construction", - base: "/var/www", - segments: ["html", "assets", "images"], - expected: "/var/www/html/assets/images", - }, - { - description: "should handle relative path construction", - base: "../parent", - segments: ["child", "grandchild"], - expected: "../parent/child/grandchild", - }, - { - description: "should handle Windows-style paths", - base: "C:\\Users", - segments: ["Documents", "file.txt"], - expected: "C:\\Users/Documents/file.txt", - }, - ]; - - realWorldTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("performance scenarios", () => { - it("should handle many segments efficiently", () => { - const segments = Array(100).fill("segment"); - const result = join("base", ...segments); - expect(result).toBe(`base/${segments.join("/")}`); - }); - - it("should handle long URLs", () => { - const longPath = "a".repeat(1000); - expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); - }); - }); - - describe("trailing slash preservation", () => { - const trailingSlashTests: TestCase[] = [ - { - description: - "should preserve trailing slash on final result when base has trailing slash and no segments", - base: "https://api.example.com/", - segments: [], - expected: "https://api.example.com/", - }, - { - description: "should preserve trailing slash on v1 path", - base: "https://api.example.com/v1/", - segments: [], - expected: "https://api.example.com/v1/", - }, - { - description: "should preserve trailing slash when last segment has trailing slash", - base: "https://api.example.com", - segments: ["users/"], - expected: "https://api.example.com/users/", - }, - { - description: "should preserve trailing slash with relative path", - base: "api/v1", - segments: ["users/"], - expected: "api/v1/users/", - }, - { - description: "should preserve trailing slash with multiple segments", - base: "https://api.example.com", - segments: ["v1", "collections/"], - expected: "https://api.example.com/v1/collections/", - }, - { - description: "should preserve trailing slash with base path", - base: "base", - segments: ["path1", "path2/"], - expected: "base/path1/path2/", - }, - ]; - - trailingSlashTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts deleted file mode 100644 index 42cdffb9e5ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { toQueryString } from "../../../src/core/url/index"; - -describe("Test qs toQueryString", () => { - interface BasicTestCase { - description: string; - input: any; - expected: string; - } - - describe("Basic functionality", () => { - const basicTests: BasicTestCase[] = [ - { description: "should return empty string for null", input: null, expected: "" }, - { description: "should return empty string for undefined", input: undefined, expected: "" }, - { description: "should return empty string for string primitive", input: "hello", expected: "" }, - { description: "should return empty string for number primitive", input: 42, expected: "" }, - { description: "should return empty string for true boolean", input: true, expected: "" }, - { description: "should return empty string for false boolean", input: false, expected: "" }, - { description: "should handle empty objects", input: {}, expected: "" }, - { - description: "should handle simple key-value pairs", - input: { name: "John", age: 30 }, - expected: "name=John&age=30", - }, - ]; - - basicTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Array handling", () => { - interface ArrayTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const arrayTests: ArrayTestCase[] = [ - { - description: "should handle arrays with indices format (default)", - input: { items: ["a", "b", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", - }, - { - description: "should handle arrays with repeat format", - input: { items: ["a", "b", "c"] }, - options: { arrayFormat: "repeat" }, - expected: "items=a&items=b&items=c", - }, - { - description: "should handle empty arrays", - input: { items: [] }, - expected: "", - }, - { - description: "should handle arrays with mixed types", - input: { mixed: ["string", 42, true, false] }, - expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", - }, - { - description: "should handle arrays with objects", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", - }, - { - description: "should handle arrays with objects in repeat format", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - options: { arrayFormat: "repeat" }, - expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", - }, - ]; - - arrayTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Nested objects", () => { - const nestedTests: BasicTestCase[] = [ - { - description: "should handle nested objects", - input: { user: { name: "John", age: 30 } }, - expected: "user%5Bname%5D=John&user%5Bage%5D=30", - }, - { - description: "should handle deeply nested objects", - input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, - expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle empty nested objects", - input: { user: {} }, - expected: "", - }, - ]; - - nestedTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Encoding", () => { - interface EncodingTestCase { - description: string; - input: any; - options?: { encode?: boolean }; - expected: string; - } - - const encodingTests: EncodingTestCase[] = [ - { - description: "should encode by default", - input: { name: "John Doe", email: "john@example.com" }, - expected: "name=John%20Doe&email=john%40example.com", - }, - { - description: "should not encode when encode is false", - input: { name: "John Doe", email: "john@example.com" }, - options: { encode: false }, - expected: "name=John Doe&email=john@example.com", - }, - { - description: "should encode special characters in keys", - input: { "user name": "John", "email[primary]": "john@example.com" }, - expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", - }, - { - description: "should not encode special characters in keys when encode is false", - input: { "user name": "John", "email[primary]": "john@example.com" }, - options: { encode: false }, - expected: "user name=John&email[primary]=john@example.com", - }, - ]; - - encodingTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Mixed scenarios", () => { - interface MixedTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const mixedTests: MixedTestCase[] = [ - { - description: "should handle complex nested structures", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle complex nested structures with repeat format", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - options: { arrayFormat: "repeat" }, - expected: - "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle arrays with null/undefined values", - input: { items: ["a", null, "c", undefined, "e"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", - }, - { - description: "should handle objects with null/undefined values", - input: { name: "John", age: null, email: undefined, active: true }, - expected: "name=John&age=&active=true", - }, - ]; - - mixedTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Edge cases", () => { - const edgeCaseTests: BasicTestCase[] = [ - { - description: "should handle numeric keys", - input: { "0": "zero", "1": "one" }, - expected: "0=zero&1=one", - }, - { - description: "should handle boolean values in objects", - input: { enabled: true, disabled: false }, - expected: "enabled=true&disabled=false", - }, - { - description: "should handle empty strings", - input: { name: "", description: "test" }, - expected: "name=&description=test", - }, - { - description: "should handle zero values", - input: { count: 0, price: 0.0 }, - expected: "count=0&price=0", - }, - { - description: "should handle arrays with empty strings", - input: { items: ["a", "", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", - }, - ]; - - edgeCaseTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Options combinations", () => { - interface OptionsTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; - expected: string; - } - - const optionsTests: OptionsTestCase[] = [ - { - description: "should respect both arrayFormat and encode options", - input: { items: ["a & b", "c & d"] }, - options: { arrayFormat: "repeat", encode: false }, - expected: "items=a & b&items=c & d", - }, - { - description: "should use default options when none provided", - input: { items: ["a", "b"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b", - }, - { - description: "should merge provided options with defaults", - input: { items: ["a", "b"], name: "John Doe" }, - options: { encode: false }, - expected: "items[0]=a&items[1]=b&name=John Doe", - }, - ]; - - optionsTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts deleted file mode 100644 index 98b9ec0c58b9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContainerClient", () => { - test("getAndReturnListOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string", "string"]; - const rawResponseBody = ["string", "string"]; - server - .mockEndpoint() - .post("/container/list-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - expect(response).toEqual(["string", "string"]); - }); - - test("getAndReturnListOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }, { string: "string" }]; - const rawResponseBody = [{ string: "string" }, { string: "string" }]; - server - .mockEndpoint() - .post("/container/list-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfObjects([ - { - string: "string", - }, - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - { - string: "string", - }, - ]); - }); - - test("getAndReturnSetOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string"]; - const rawResponseBody = ["string"]; - server - .mockEndpoint() - .post("/container/set-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - expect(response).toEqual(new Set(["string"])); - }); - - test("getAndReturnSetOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }]; - const rawResponseBody = [{ string: "string" }]; - server - .mockEndpoint() - .post("/container/set-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfObjects([ - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - ]); - }); - - test("getAndReturnMapPrimToPrim", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/map-prim-to-prim") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnMapOfPrimToObject", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: { string: "string" } }; - const rawResponseBody = { string: { string: "string" } }; - server - .mockEndpoint() - .post("/container/map-prim-to-object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ - string: { - string: "string", - }, - }); - expect(response).toEqual({ - string: { - string: "string", - }, - }); - }); - - test("getAndReturnOptional", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/opt-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnOptional({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts deleted file mode 100644 index 4bc8916f7ce5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContentTypeClient", () => { - test("postJsonPatchContentType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); - - test("postJsonPatchContentWithCharsetType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts deleted file mode 100644 index 5770be42a097..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("EnumClient", () => { - test("getAndReturnEnum", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SUNNY"; - const rawResponseBody = "SUNNY"; - server - .mockEndpoint() - .post("/enum") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); - expect(response).toEqual("SUNNY"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts deleted file mode 100644 index b9e26c032ff9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts +++ /dev/null @@ -1,212 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("HttpMethodsClient", () => { - test("testGet", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.httpMethods.testGet("id"); - expect(response).toEqual("string"); - }); - - test("testPost", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/http-methods") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPost({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPut", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .put("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPut("id", { - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPatch", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .patch("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testDelete", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = true; - server - .mockEndpoint() - .delete("/http-methods/id") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testDelete("id"); - expect(response).toEqual(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts deleted file mode 100644 index 685826602e5e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts +++ /dev/null @@ -1,448 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ObjectClient", () => { - test("getAndReturnWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/object/get-and-return-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("getAndReturnWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/object/get-and-return-with-required-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnWithMapOfMap", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { map: { map: { map: "map" } } }; - const rawResponseBody = { map: { map: { map: "map" } } }; - server - .mockEndpoint() - .post("/object/get-and-return-with-map-of-map") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - map: { - map: "map", - }, - }, - }); - expect(response).toEqual({ - map: { - map: { - map: "map", - }, - }, - }); - }); - - test("getAndReturnNestedWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredFieldAsList", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - ]; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field-list") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - ]); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts deleted file mode 100644 index be2e7ddd6591..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ParamsClient", () => { - test("getWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithPath("param"); - expect(response).toEqual("string"); - }); - - test("getWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithInlinePath({ - param: "param", - }); - expect(response).toEqual("string"); - }); - - test("getWithQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithAllowMultipleQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithPathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithPathAndQuery("param", { - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("getWithInlinePathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("modifyWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithPath("param", "string"); - expect(response).toEqual("string"); - }); - - test("modifyWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string", - }); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts deleted file mode 100644 index 650fc620bb1d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PrimitiveClient", () => { - test("getAndReturnString", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .post("/primitive/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnString("string"); - expect(response).toEqual("string"); - }); - - test("getAndReturnInt", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1; - const rawResponseBody = 1; - server - .mockEndpoint() - .post("/primitive/integer") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnInt(1); - expect(response).toEqual(1); - }); - - test("getAndReturnLong", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1000000; - const rawResponseBody = 1000000; - server - .mockEndpoint() - .post("/primitive/long") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnLong(1000000); - expect(response).toEqual(1000000); - }); - - test("getAndReturnDouble", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1.1; - const rawResponseBody = 1.1; - server - .mockEndpoint() - .post("/primitive/double") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDouble(1.1); - expect(response).toEqual(1.1); - }); - - test("getAndReturnBool", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = true; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/primitive/boolean") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBool(true); - expect(response).toEqual(true); - }); - - test("getAndReturnDatetime", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2024-01-15T09:30:00Z"; - const rawResponseBody = "2024-01-15T09:30:00Z"; - server - .mockEndpoint() - .post("/primitive/datetime") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); - }); - - test("getAndReturnDate", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2023-01-15"; - const rawResponseBody = "2023-01-15"; - server - .mockEndpoint() - .post("/primitive/date") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - expect(response).toEqual("2023-01-15"); - }); - - test("getAndReturnUUID", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - server - .mockEndpoint() - .post("/primitive/uuid") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - }); - - test("getAndReturnBase64", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SGVsbG8gd29ybGQh"; - const rawResponseBody = "SGVsbG8gd29ybGQh"; - server - .mockEndpoint() - .post("/primitive/base64") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - expect(response).toEqual("SGVsbG8gd29ybGQh"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts deleted file mode 100644 index 1481521d77b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PutClient", () => { - test("add", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - errors: [ - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - ], - }; - server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.put.add({ - id: "id", - }); - expect(response).toEqual({ - errors: [ - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - ], - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts deleted file mode 100644 index 35b1405e89ca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UnionClient", () => { - test("getAndReturnUnion", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; - const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; - server - .mockEndpoint() - .post("/union") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - expect(response).toEqual({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts deleted file mode 100644 index b450fbeea217..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UrlsClient", () => { - test("withMixedCase", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.urls.withMixedCase(); - expect(response).toEqual("string"); - }); - - test("noEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/no-ending-slash") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.noEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with-ending-slash/") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withUnderscores", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with_underscores") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withUnderscores(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts deleted file mode 100644 index 61b5a64bce8f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts +++ /dev/null @@ -1,150 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("InlinedRequestsClient", () => { - test("postWithObjectBodyandResponse (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithObjectBodyandResponse (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts deleted file mode 100644 index 3317cf1a69d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoAuthClient", () => { - test("postWithNoAuth (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.noAuth.postWithNoAuth({ - key: "value", - }); - expect(response).toEqual(true); - }); - - test("postWithNoAuth (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.noAuth.postWithNoAuth({ - key: "value", - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts deleted file mode 100644 index 8f5f6a59a512..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoReqBodyClient", () => { - test("getWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.getWithNoRequestBody(); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.postWithNoRequestBody(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts deleted file mode 100644 index a128d4844ba2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("ReqWithHeadersClient", () => { - test("getWithCustomHeader", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - - server - .mockEndpoint() - .post("/test-headers/custom-header") - .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") - .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .build(); - - const response = await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json deleted file mode 100644 index d7627675de20..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "extendedDiagnostics": true, - "strict": true, - "target": "ES6", - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "dist", - "rootDir": "src", - "baseUrl": "src", - "isolatedModules": true, - "isolatedDeclarations": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json deleted file mode 100644 index 5c11446f5984..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "dist/cjs" - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json deleted file mode 100644 index 6ce909748b2c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "esnext", - "outDir": "dist/esm", - "verbatimModuleSyntax": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json deleted file mode 100644 index d77fdf00d259..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.cjs.json" -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts deleted file mode 100644 index ba2ec4f9d45a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from "vitest/config"; -export default defineConfig({ - test: { - projects: [ - { - test: { - globals: true, - name: "unit", - environment: "node", - root: "./tests", - include: ["**/*.test.{js,ts,jsx,tsx}"], - exclude: ["wire/**"], - setupFiles: ["./setup.ts"], - }, - }, - { - test: { - globals: true, - name: "wire", - environment: "node", - root: "./tests/wire", - setupFiles: ["../setup.ts", "../mock-server/setup.ts"], - }, - }, - ], - passWithNoTests: true, - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json deleted file mode 100644 index bc0673c609b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "cliVersion": "DUMMY", - "generatorName": "fernapi/fern-typescript-sdk", - "generatorVersion": "latest", - "generatorConfig": { - "serializationFormat": "zurg" - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml deleted file mode 100644 index 836106996595..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml +++ /dev/null @@ -1,78 +0,0 @@ -name: ci - -on: [push] - -jobs: - compile: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Compile - run: pnpm build - - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Test - run: pnpm test - - publish: - needs: [ compile, test ] - if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v6 - - - name: Set up node - uses: actions/setup-node@v6 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build - run: pnpm build - - - name: Publish to npm - run: | - npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} - publish() { # use latest npm to ensure OIDC support - npx -y npm@latest publish "$@" - } - if [[ ${GITHUB_REF} == *alpha* ]]; then - publish --access public --tag alpha - elif [[ ${GITHUB_REF} == *beta* ]]; then - publish --access public --tag beta - else - publish --access public - fi - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore deleted file mode 100644 index 72271e049c02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.DS_Store -/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md deleted file mode 100644 index fe5bc2f77e0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md +++ /dev/null @@ -1,133 +0,0 @@ -# Contributing - -Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. - -## Getting Started - -### Prerequisites - -- Node.js 20 or higher -- pnpm package manager - -### Installation - -Install the project dependencies: - -```bash -pnpm install -``` - -### Building - -Build the project: - -```bash -pnpm build -``` - -### Testing - -Run the test suite: - -```bash -pnpm test -``` - -Run specific test types: -- `pnpm test:unit` - Run unit tests -- `pnpm test:wire` - Run wire/integration tests - -### Linting and Formatting - -Check code style: - -```bash -pnpm run lint -pnpm run format:check -``` - -Fix code style issues: - -```bash -pnpm run lint:fix -pnpm run format:fix -``` - -Or use the combined check command: - -```bash -pnpm run check:fix -``` - -## About Generated Code - -**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. - -### Generated Files - -The following directories contain generated code: -- `src/api/` - API client classes and types -- `src/serialization/` - Serialization/deserialization logic -- Most TypeScript files in `src/` - -### How to Customize - -If you need to customize the SDK, you have two options: - -#### Option 1: Use `.fernignore` - -For custom code that should persist across SDK regenerations: - -1. Create a `.fernignore` file in the project root -2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) -3. Add your custom code to those files - -Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. - -For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). - -#### Option 2: Contribute to the Generator - -If you want to change how code is generated for all users of this SDK: - -1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) -2. Generator code is located at `generators/typescript/sdk/` -3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) -4. Submit a pull request with your changes to the generator - -This approach is best for: -- Bug fixes in generated code -- New features that would benefit all users -- Improvements to code generation patterns - -## Making Changes - -### Workflow - -1. Create a new branch for your changes -2. Make your modifications -3. Run tests to ensure nothing breaks: `pnpm test` -4. Run linting and formatting: `pnpm run check:fix` -5. Build the project: `pnpm build` -6. Commit your changes with a clear commit message -7. Push your branch and create a pull request - -### Commit Messages - -Write clear, descriptive commit messages that explain what changed and why. - -### Code Style - -This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. - -## Questions or Issues? - -If you have questions or run into issues: - -1. Check the [Fern documentation](https://buildwithfern.com) -2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) -3. Open a new issue if your question hasn't been addressed - -## License - -By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md deleted file mode 100644 index 140b1fb505f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md +++ /dev/null @@ -1,241 +0,0 @@ -# Seed TypeScript Library - -[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) -[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) - -The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. - -## Installation - -```sh -npm i -s @fern/exhaustive -``` - -## Reference - -A full reference for this library is available [here](./reference.md). - -## Usage - -Instantiate and use the client with the following: - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); -``` - -## Request And Response Types - -The SDK exports all request and response types as TypeScript interfaces. Simply import them with the -following namespace: - -```typescript -import { SeedExhaustive } from "@fern/exhaustive"; - -const request: SeedExhaustive.GetWithInlinePath = { - ... -}; -``` - -## Exception Handling - -When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error -will be thrown. - -```typescript -import { SeedExhaustiveError } from "@fern/exhaustive"; - -try { - await client.endpoints.container.getAndReturnListOfPrimitives(...); -} catch (err) { - if (err instanceof SeedExhaustiveError) { - console.log(err.statusCode); - console.log(err.message); - console.log(err.body); - console.log(err.rawResponse); - } -} -``` - -## Advanced - -### Additional Headers - -If you would like to send additional headers as part of the request, use the `headers` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - headers: { - 'X-Custom-Header': 'custom value' - } -}); -``` - -### Additional Query String Parameters - -If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - queryParams: { - 'customQueryParamKey': 'custom query param value' - } -}); -``` - -### Retries - -The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long -as the request is deemed retryable and the number of retry attempts has not grown larger than the configured -retry limit (default: 2). - -A request is deemed retryable when any of the following HTTP status codes is returned: - -- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) -- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) -- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) - -Use the `maxRetries` request option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - maxRetries: 0 // override maxRetries at the request level -}); -``` - -### Timeouts - -The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. - -```typescript -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - timeoutInSeconds: 30 // override timeout to 30s -}); -``` - -### Aborting Requests - -The SDK allows users to abort requests at any point by passing in an abort signal. - -```typescript -const controller = new AbortController(); -const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { - abortSignal: controller.signal -}); -controller.abort(); // aborts the request -``` - -### Access Raw Response Data - -The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. -The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. - -```typescript -const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); - -console.log(data); -console.log(rawResponse.headers['X-My-Header']); -``` - -### Logging - -The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. - -```typescript -import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - logging: { - level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info - logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger - silent: false, // defaults to true, set to false to enable logging - } -}); -``` -The `logging` object can have the following properties: -- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. -- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. -- `silent`: Whether to silence the logger. Defaults to `true`. - -The `level` property can be one of the following values: -- `logging.LogLevel.Debug` -- `logging.LogLevel.Info` -- `logging.LogLevel.Warn` -- `logging.LogLevel.Error` - -To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. - -
-Custom logger examples - -Here's an example using the popular `winston` logging library. -```ts -import winston from 'winston'; - -const winstonLogger = winston.createLogger({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => winstonLogger.debug(msg, ...args), - info: (msg, ...args) => winstonLogger.info(msg, ...args), - warn: (msg, ...args) => winstonLogger.warn(msg, ...args), - error: (msg, ...args) => winstonLogger.error(msg, ...args), -}; -``` - -Here's an example using the popular `pino` logging library. - -```ts -import pino from 'pino'; - -const pinoLogger = pino({...}); - -const logger: logging.ILogger = { - debug: (msg, ...args) => pinoLogger.debug(args, msg), - info: (msg, ...args) => pinoLogger.info(args, msg), - warn: (msg, ...args) => pinoLogger.warn(args, msg), - error: (msg, ...args) => pinoLogger.error(args, msg), -}; -``` -
- - -### Runtime Compatibility - - -The SDK works in the following runtimes: - - - -- Node.js 18+ -- Vercel -- Cloudflare Workers -- Deno v1.25+ -- Bun 1.0+ -- React Native - -### Customizing Fetch Client - -The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an -unsupported environment, this provides a way for you to break glass and ensure the SDK works. - -```typescript -import { SeedExhaustiveClient } from "@fern/exhaustive"; - -const client = new SeedExhaustiveClient({ - ... - fetcher: // provide your implementation here -}); -``` - -## Contributing - -While we value open-source contributions to this SDK, this library is generated programmatically. -Additions made directly to this library would have to be moved over to our generation code, -otherwise they would be overwritten upon the next generated release. Feel free to open a PR as -a proof of concept, but know that we will not be able to merge it as-is. We suggest opening -an issue first to discuss with us! - -On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json deleted file mode 100644 index a777468e4ae2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", - "root": true, - "vcs": { - "enabled": false - }, - "files": { - "ignoreUnknown": true, - "includes": [ - "**", - "!!dist", - "!!**/dist", - "!!lib", - "!!**/lib", - "!!_tmp_*", - "!!**/_tmp_*", - "!!*.tmp", - "!!**/*.tmp", - "!!.tmp/", - "!!**/.tmp/", - "!!*.log", - "!!**/*.log", - "!!**/.DS_Store", - "!!**/Thumbs.db" - ] - }, - "formatter": { - "enabled": true, - "indentStyle": "space", - "indentWidth": 4, - "lineWidth": 120 - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - }, - "linter": { - "rules": { - "style": { - "useNodejsImportProtocol": "off" - }, - "suspicious": { - "noAssignInExpressions": "warn", - "noUselessEscapeInString": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noThenProperty": "warn", - "useIterableCallbackReturn": "warn", - "noShadowRestrictedNames": "warn", - "noTsIgnore": { - "level": "warn", - "fix": "none", - "options": {} - }, - "noConfusingVoidType": { - "level": "warn", - "fix": "none", - "options": {} - } - } - } - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json deleted file mode 100644 index ac3de0f37468..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "@fern/exhaustive", - "version": "0.0.1", - "private": false, - "repository": "github:exhaustive/fern", - "type": "commonjs", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.mjs", - "types": "./dist/cjs/index.d.ts", - "exports": { - ".": { - "types": "./dist/cjs/index.d.ts", - "import": { - "types": "./dist/esm/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/index.d.ts", - "default": "./dist/cjs/index.js" - }, - "default": "./dist/cjs/index.js" - }, - "./serialization": { - "types": "./dist/cjs/serialization/index.d.ts", - "import": { - "types": "./dist/esm/serialization/index.d.mts", - "default": "./dist/esm/serialization/index.mjs" - }, - "require": { - "types": "./dist/cjs/serialization/index.d.ts", - "default": "./dist/cjs/serialization/index.js" - }, - "default": "./dist/cjs/serialization/index.js" - }, - "./package.json": "./package.json" - }, - "files": [ - "dist", - "reference.md", - "README.md", - "LICENSE" - ], - "scripts": { - "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", - "build": "pnpm build:cjs && pnpm build:esm", - "build:cjs": "tsc --project ./tsconfig.cjs.json", - "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", - "test": "vitest", - "test:unit": "vitest --project unit", - "test:wire": "vitest --project wire" - }, - "dependencies": {}, - "devDependencies": { - "webpack": "^5.97.1", - "ts-loader": "^9.5.1", - "vitest": "^3.2.4", - "msw": "2.11.2", - "@types/node": "^18.19.70", - "typescript": "~5.7.2", - "@biomejs/biome": "2.3.1" - }, - "browser": { - "fs": false, - "os": false, - "path": false, - "stream": false - }, - "packageManager": "pnpm@10.20.0", - "engines": { - "node": ">=18.0.0" - }, - "sideEffects": false -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml deleted file mode 100644 index 6e4c395107df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml +++ /dev/null @@ -1 +0,0 @@ -packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md deleted file mode 100644 index b571afcab9fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md +++ /dev/null @@ -1,2761 +0,0 @@ -# Reference -## Endpoints Container -
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnListOfObjects([{ - string: "string" - }, { - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Set` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnSetOfObjects([{ - string: "string" - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapPrimToPrim({ - "string": "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnMapOfPrimToObject({ - "string": { - string: "string" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Record` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.container.getAndReturnOptional({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ContainerClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints ContentType -
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ContentTypeClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Enum -
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.enum.getAndReturnEnum("SUNNY"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.WeatherReport` - -
-
- -
-
- -**requestOptions:** `EnumClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints HttpMethods -
client.endpoints.httpMethods.testGet(id) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testGet("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPost({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPut("id", { - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.httpMethods.testDelete(id) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.httpMethods.testDelete("id"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**id:** `string` - -
-
- -
-
- -**requestOptions:** `HttpMethodsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Object -
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - "map": { - "map": "map" - } - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ObjectWithMapOfMap` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithOptionalField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**string:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }, { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } - }]); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` - -
-
- -
-
- -**requestOptions:** `ObjectClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Params -
client.endpoints.params.getWithPath(param) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPath("param"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePath({ - param: "param" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with multiple of same query param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1 -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithPathAndQuery("param", { - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void -
-
- -#### 📝 Description - -
-
- -
-
- -GET with path and query params -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithPath(param, { ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithPath("param", "string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**param:** `string` - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string -
-
- -#### 📝 Description - -
-
- -
-
- -PUT to update with path param -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` - -
-
- -
-
- -**requestOptions:** `ParamsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Primitive -
client.endpoints.primitive.getAndReturnString({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnString("string"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnInt(1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnLong(1000000); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDouble(1.1); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `number` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBool(true); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `boolean` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `Date` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `string` - -
-
- -
-
- -**requestOptions:** `PrimitiveClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Put -
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.put.add({ - id: "id" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.endpoints.PutRequest` - -
-
- -
-
- -**requestOptions:** `PutClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Union -
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.Animal` - -
-
- -
-
- -**requestOptions:** `UnionClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## Endpoints Urls -
client.endpoints.urls.withMixedCase() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withMixedCase(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.noEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.noEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withEndingSlash() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withEndingSlash(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.endpoints.urls.withUnderscores() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.endpoints.urls.withUnderscores(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `UrlsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## InlinedRequests -
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 📝 Description - -
-
- -
-
- -POST with custom object in request body, response is an object -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map" - }, - bigint: "1000000" - } -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.PostWithObjectBody` - -
-
- -
-
- -**requestOptions:** `InlinedRequestsClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoAuth -
client.noAuth.postWithNoAuth({ ...params }) -> boolean -
-
- -#### 📝 Description - -
-
- -
-
- -POST request with no auth -
-
-
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noAuth.postWithNoAuth({ - "key": "value" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `unknown` - -
-
- -
-
- -**requestOptions:** `NoAuthClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## NoReqBody -
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.getWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -
client.noReqBody.postWithNoRequestBody() -> string -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.noReqBody.postWithNoRequestBody(); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**requestOptions:** `NoReqBodyClient.RequestOptions` - -
-
-
-
- - -
-
-
- -## ReqWithHeaders -
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void -
-
- -#### 🔌 Usage - -
-
- -
-
- -```typescript -await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string" -}); - -``` -
-
-
-
- -#### ⚙️ Parameters - -
-
- -
-
- -**request:** `SeedExhaustive.ReqWithHeaders` - -
-
- -
-
- -**requestOptions:** `ReqWithHeadersClient.RequestOptions` - -
-
-
-
- - -
-
-
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js deleted file mode 100644 index dc1df1cbbacb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs").promises; -const path = require("path"); - -const extensionMap = { - ".js": ".mjs", - ".d.ts": ".d.mts", -}; -const oldExtensions = Object.keys(extensionMap); - -async function findFiles(rootPath) { - const files = []; - - async function scan(directory) { - const entries = await fs.readdir(directory, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(directory, entry.name); - - if (entry.isDirectory()) { - if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { - await scan(fullPath); - } - } else if (entry.isFile()) { - if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { - files.push(fullPath); - } - } - } - } - - await scan(rootPath); - return files; -} - -async function updateFiles(files) { - const updatedFiles = []; - for (const file of files) { - const updated = await updateFileContents(file); - updatedFiles.push(updated); - } - - console.log(`Updated imports in ${updatedFiles.length} files.`); -} - -async function updateFileContents(file) { - const content = await fs.readFile(file, "utf8"); - - let newContent = content; - // Update each extension type defined in the map - for (const [oldExt, newExt] of Object.entries(extensionMap)) { - // Handle static imports/exports - const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); - newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); - - // Handle dynamic imports (yield import, await import, regular import()) - const dynamicRegex = new RegExp( - `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, - "g", - ); - newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); - } - - if (content !== newContent) { - await fs.writeFile(file, newContent, "utf8"); - return true; - } - return false; -} - -async function renameFiles(files) { - let counter = 0; - for (const file of files) { - const ext = oldExtensions.find((ext) => file.endsWith(ext)); - const newExt = extensionMap[ext]; - - if (newExt) { - const newPath = file.slice(0, -ext.length) + newExt; - await fs.rename(file, newPath); - counter++; - } - } - - console.log(`Renamed ${counter} files.`); -} - -async function main() { - try { - const targetDir = process.argv[2]; - if (!targetDir) { - console.error("Please provide a target directory"); - process.exit(1); - } - - const targetPath = path.resolve(targetDir); - const targetStats = await fs.stat(targetPath); - - if (!targetStats.isDirectory()) { - console.error("The provided path is not a directory"); - process.exit(1); - } - - console.log(`Scanning directory: ${targetDir}`); - - const files = await findFiles(targetDir); - - if (files.length === 0) { - console.log("No matching files found."); - process.exit(0); - } - - console.log(`Found ${files.length} files.`); - await updateFiles(files); - await renameFiles(files); - console.log("\nDone!"); - } catch (error) { - console.error("An error occurred:", error.message); - process.exit(1); - } -} - -main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json deleted file mode 100644 index 875b76c4bb57..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "endpoints": [ - { - "id": { - "path": "/container/list-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" - } - }, - { - "id": { - "path": "/container/list-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/set-of-primitives", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" - } - }, - { - "id": { - "path": "/container/set-of-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-prim", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" - } - }, - { - "id": { - "path": "/container/map-prim-to-object", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" - } - }, - { - "id": { - "path": "/container/opt-objects", - "method": "POST", - "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/foo/bar", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/foo/baz", - "method": "POST", - "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/enum", - "method": "POST", - "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "GET", - "identifier_override": "endpoint_endpoints/http-methods.testGet" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" - } - }, - { - "id": { - "path": "/http-methods", - "method": "POST", - "identifier_override": "endpoint_endpoints/http-methods.testPost" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/http-methods.testPut" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "PATCH", - "identifier_override": "endpoint_endpoints/http-methods.testPatch" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/http-methods/{id}", - "method": "DELETE", - "identifier_override": "endpoint_endpoints/http-methods.testDelete" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-required-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-with-map-of-map", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-optional-field", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field/{string}", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/object/get-and-return-nested-with-required-field-list", - "method": "POST", - "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path-query/{param}", - "method": "GET", - "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithPath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" - } - }, - { - "id": { - "path": "/params/path/{param}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" - } - }, - { - "id": { - "path": "/primitive/string", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" - } - }, - { - "id": { - "path": "/primitive/integer", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" - } - }, - { - "id": { - "path": "/primitive/long", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" - } - }, - { - "id": { - "path": "/primitive/double", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" - } - }, - { - "id": { - "path": "/primitive/boolean", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" - } - }, - { - "id": { - "path": "/primitive/datetime", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" - } - }, - { - "id": { - "path": "/primitive/date", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" - } - }, - { - "id": { - "path": "/primitive/uuid", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" - } - }, - { - "id": { - "path": "/primitive/base64", - "method": "POST", - "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" - } - }, - { - "id": { - "path": "/{id}", - "method": "PUT", - "identifier_override": "endpoint_endpoints/put.add" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" - } - }, - { - "id": { - "path": "/union", - "method": "POST", - "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" - } - }, - { - "id": { - "path": "/urls/MixedCase", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withMixedCase" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" - } - }, - { - "id": { - "path": "/urls/no-ending-slash", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.noEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with-ending-slash/", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withEndingSlash" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" - } - }, - { - "id": { - "path": "/urls/with_underscores", - "method": "GET", - "identifier_override": "endpoint_endpoints/urls.withUnderscores" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" - } - }, - { - "id": { - "path": "/req-bodies/object", - "method": "POST", - "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" - } - }, - { - "id": { - "path": "/no-auth", - "method": "POST", - "identifier_override": "endpoint_no-auth.postWithNoAuth" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "GET", - "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/no-req-body", - "method": "POST", - "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" - } - }, - { - "id": { - "path": "/test-headers/custom-header", - "method": "POST", - "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" - }, - "snippet": { - "type": "typescript", - "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" - } - } - ], - "types": {} -} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts deleted file mode 100644 index f28de2b4c43c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts +++ /dev/null @@ -1,82 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; -import { mergeHeaders } from "./core/headers.js"; -import * as core from "./core/index.js"; - -export interface BaseClientOptions { - environment: core.Supplier; - /** Specify a custom URL to connect the client to. */ - baseUrl?: core.Supplier; - token?: core.Supplier; - /** Additional headers to include in requests. */ - headers?: Record | null | undefined>; - /** The default maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The default number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ - fetch?: typeof fetch; - /** Configure logging for the client. */ - logging?: core.logging.LogConfig | core.logging.Logger; -} - -export interface BaseRequestOptions { - /** The maximum time to wait for a response in seconds. */ - timeoutInSeconds?: number; - /** The number of times to retry the request. Defaults to 2. */ - maxRetries?: number; - /** A hook to abort the request. */ - abortSignal?: AbortSignal; - /** Additional query string parameters to include in the request. */ - queryParams?: Record; - /** Additional headers to include in the request. */ - headers?: Record | null | undefined>; -} - -export type NormalizedClientOptions = T & { - logging: core.logging.Logger; - authProvider?: core.AuthProvider; -}; - -export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { - authProvider: core.AuthProvider; -}; - -export function normalizeClientOptions(options: T): NormalizedClientOptions { - const headers = mergeHeaders( - { - "X-Fern-Language": "JavaScript", - "X-Fern-SDK-Name": "@fern/exhaustive", - "X-Fern-SDK-Version": "0.0.1", - "User-Agent": "@fern/exhaustive/0.0.1", - "X-Fern-Runtime": core.RUNTIME.type, - "X-Fern-Runtime-Version": core.RUNTIME.version, - }, - options?.headers, - ); - - return { - ...options, - logging: core.logging.createLogger(options?.logging), - headers, - } as NormalizedClientOptions; -} - -export function normalizeClientOptionsWithAuth( - options: T, -): NormalizedClientOptionsWithAuth { - const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; - const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); - normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); - return normalized; -} - -function withNoOpAuthProvider( - options: NormalizedClientOptions, -): NormalizedClientOptionsWithAuth { - return { - ...options, - authProvider: new core.NoOpAuthProvider(), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts deleted file mode 100644 index d5ca904d9544..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; -import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; -import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; -import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; -import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; -import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; - -export declare namespace SeedExhaustiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class SeedExhaustiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _endpoints: EndpointsClient | undefined; - protected _inlinedRequests: InlinedRequestsClient | undefined; - protected _noAuth: NoAuthClient | undefined; - protected _noReqBody: NoReqBodyClient | undefined; - protected _reqWithHeaders: ReqWithHeadersClient | undefined; - - constructor(options: SeedExhaustiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get endpoints(): EndpointsClient { - return (this._endpoints ??= new EndpointsClient(this._options)); - } - - public get inlinedRequests(): InlinedRequestsClient { - return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); - } - - public get noAuth(): NoAuthClient { - return (this._noAuth ??= new NoAuthClient(this._options)); - } - - public get noReqBody(): NoReqBodyClient { - return (this._noReqBody ??= new NoReqBodyClient(this._options)); - } - - public get reqWithHeaders(): ReqWithHeadersClient { - return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts deleted file mode 100644 index b124def3d861..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts +++ /dev/null @@ -1,76 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { ContainerClient } from "../resources/container/client/Client.js"; -import { ContentTypeClient } from "../resources/contentType/client/Client.js"; -import { EnumClient } from "../resources/enum/client/Client.js"; -import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; -import { ObjectClient } from "../resources/object/client/Client.js"; -import { ParamsClient } from "../resources/params/client/Client.js"; -import { PrimitiveClient } from "../resources/primitive/client/Client.js"; -import { PutClient } from "../resources/put/client/Client.js"; -import { UnionClient } from "../resources/union/client/Client.js"; -import { UrlsClient } from "../resources/urls/client/Client.js"; - -export declare namespace EndpointsClient { - export interface Options extends BaseClientOptions {} -} - -export class EndpointsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - protected _container: ContainerClient | undefined; - protected _contentType: ContentTypeClient | undefined; - protected _enum: EnumClient | undefined; - protected _httpMethods: HttpMethodsClient | undefined; - protected _object: ObjectClient | undefined; - protected _params: ParamsClient | undefined; - protected _primitive: PrimitiveClient | undefined; - protected _put: PutClient | undefined; - protected _union: UnionClient | undefined; - protected _urls: UrlsClient | undefined; - - constructor(options: EndpointsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - public get container(): ContainerClient { - return (this._container ??= new ContainerClient(this._options)); - } - - public get contentType(): ContentTypeClient { - return (this._contentType ??= new ContentTypeClient(this._options)); - } - - public get enum(): EnumClient { - return (this._enum ??= new EnumClient(this._options)); - } - - public get httpMethods(): HttpMethodsClient { - return (this._httpMethods ??= new HttpMethodsClient(this._options)); - } - - public get object(): ObjectClient { - return (this._object ??= new ObjectClient(this._options)); - } - - public get params(): ParamsClient { - return (this._params ??= new ParamsClient(this._options)); - } - - public get primitive(): PrimitiveClient { - return (this._primitive ??= new PrimitiveClient(this._options)); - } - - public get put(): PutClient { - return (this._put ??= new PutClient(this._options)); - } - - public get union(): UnionClient { - return (this._union ??= new UnionClient(this._options)); - } - - public get urls(): UrlsClient { - return (this._urls ??= new UrlsClient(this._options)); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts deleted file mode 100644 index 9eb1192dcc32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts deleted file mode 100644 index 32bb0a7fc21e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts +++ /dev/null @@ -1,543 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContainerClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContainerClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContainerClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) - */ - public getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnListOfPrimitives( - request: string[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response.parseOrThrow( - _response.body, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/list-of-primitives", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnListOfObjects([{ - * string: "string" - * }, { - * string: "string" - * }]) - */ - public getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); - } - - private async __getAndReturnListOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/list-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnListOfObjects.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnListOfObjects.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); - } - - /** - * @param {Set} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) - */ - public getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); - } - - private async __getAndReturnSetOfPrimitives( - request: Set, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-primitives", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.parseOrThrow( - _response.body, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnSetOfObjects([{ - * string: "string" - * }]) - */ - public getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); - } - - private async __getAndReturnSetOfObjects( - request: SeedExhaustive.types.ObjectWithRequiredField[], - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/set-of-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnSetOfObjects.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapPrimToPrim({ - * "string": "string" - * }) - */ - public getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); - } - - private async __getAndReturnMapPrimToPrim( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-prim", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); - } - - /** - * @param {Record} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnMapOfPrimToObject({ - * "string": { - * string: "string" - * } - * }) - */ - public getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise> { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); - } - - private async __getAndReturnMapOfPrimToObject( - request: Record, - requestOptions?: ContainerClient.RequestOptions, - ): Promise>> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/map-prim-to-object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.parseOrThrow( - _response.body, - { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }, - ), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/container/map-prim-to-object", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.container.getAndReturnOptional({ - * string: "string" - * }) - */ - public getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); - } - - private async __getAndReturnOptional( - request?: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ContainerClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/container/opt-objects", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: - request != null - ? serializers.endpoints.container.getAndReturnOptional.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }) - : undefined, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.container.getAndReturnOptional.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts deleted file mode 100644 index 75f492ac343f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts +++ /dev/null @@ -1,178 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ContentTypeClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ContentTypeClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ContentTypeClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); - } - - private async __postJsonPatchContentType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/bar", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__postJsonPatchContentWithCharsetType(request, requestOptions), - ); - } - - private async __postJsonPatchContentWithCharsetType( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ContentTypeClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/foo/baz", - ), - method: "POST", - headers: _headers, - contentType: "application/json-patch+json; charset=utf-8", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts deleted file mode 100644 index 9c9b0cd87c76..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace EnumClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class EnumClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: EnumClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.WeatherReport} request - * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.enum.getAndReturnEnum("SUNNY") - */ - public getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); - } - - private async __getAndReturnEnum( - request: SeedExhaustive.types.WeatherReport, - requestOptions?: EnumClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/enum", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.WeatherReport.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.WeatherReport.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts deleted file mode 100644 index 0298be639cde..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts +++ /dev/null @@ -1,380 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace HttpMethodsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class HttpMethodsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: HttpMethodsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testGet("id") - */ - public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); - } - - private async __testGet( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testGet.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPost({ - * string: "string" - * }) - */ - public testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); - } - - private async __testPost( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/http-methods", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPut("id", { - * string: "string" - * }) - */ - public testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); - } - - private async __testPut( - id: string, - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testPatch("id", { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); - } - - private async __testPatch( - id: string, - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "PATCH", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); - } - - /** - * @param {string} id - * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.httpMethods.testDelete("id") - */ - public testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); - } - - private async __testDelete( - id: string, - requestOptions?: HttpMethodsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/http-methods/${core.url.encodePathParam(id)}`, - ), - method: "DELETE", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.httpMethods.testDelete.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts deleted file mode 100644 index 6046843b5e42..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -export * as container from "./container/index.js"; -export * as contentType from "./contentType/index.js"; -export * as enum_ from "./enum/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * from "./params/client/requests/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * from "./put/client/requests/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as union from "./union/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts deleted file mode 100644 index f7bbef9f5c00..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts +++ /dev/null @@ -1,577 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ObjectClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ObjectClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ObjectClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.ObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithOptionalField({ - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * }) - */ - public getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); - } - - private async __getAndReturnWithOptionalField( - request: SeedExhaustive.types.ObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-optional-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithRequiredField({ - * string: "string" - * }) - */ - public getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); - } - - private async __getAndReturnWithRequiredField( - request: SeedExhaustive.types.ObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-required-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithRequiredField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-required-field", - ); - } - - /** - * @param {SeedExhaustive.types.ObjectWithMapOfMap} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnWithMapOfMap({ - * map: { - * "map": { - * "map": "map" - * } - * } - * }) - */ - public getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); - } - - private async __getAndReturnWithMapOfMap( - request: SeedExhaustive.types.ObjectWithMapOfMap, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-with-map-of-map", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.ObjectWithMapOfMap.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithMapOfMap.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-with-map-of-map", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithOptionalField({ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithOptionalField(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithOptionalField( - request: SeedExhaustive.types.NestedObjectWithOptionalField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-optional-field", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithOptionalField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-optional-field", - ); - } - - /** - * @param {string} string - * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredField( - string: string, - request: SeedExhaustive.types.NestedObjectWithRequiredField, - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.NestedObjectWithRequiredField.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field/{string}", - ); - } - - /** - * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request - * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }, { - * string: "string", - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }]) - */ - public getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise( - this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), - ); - } - - private async __getAndReturnNestedWithRequiredFieldAsList( - request: SeedExhaustive.types.NestedObjectWithRequiredField[], - requestOptions?: ObjectClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/object/get-and-return-nested-with-required-field-list", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError( - _response.error, - _response.rawResponse, - "POST", - "/object/get-and-return-nested-with-required-field-list", - ); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts deleted file mode 100644 index e26b85a0f305..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts +++ /dev/null @@ -1,565 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace ParamsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ParamsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ParamsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * GET with path param - * - * @param {string} param - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPath("param") - */ - public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); - } - - private async __getWithPath( - param: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithPath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with path param - * - * @param {SeedExhaustive.endpoints.GetWithInlinePath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePath({ - * param: "param" - * }) - */ - public getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); - } - - private async __getWithInlinePath( - request: SeedExhaustive.endpoints.GetWithInlinePath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.getWithInlinePath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); - } - - /** - * GET with query param - * - * @param {SeedExhaustive.endpoints.GetWithQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); - } - - private async __getWithQuery( - request: SeedExhaustive.endpoints.GetWithQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - _queryParams.number = number_.toString(); - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with multiple of same query param - * - * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithAllowMultipleQuery({ - * query: "query", - * number: 1 - * }) - */ - public getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); - } - - private async __getWithAllowMultipleQuery( - request: SeedExhaustive.endpoints.GetWithMultipleQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query, number: number_ } = request; - const _queryParams: Record = {}; - if (Array.isArray(query)) { - _queryParams.query = query.map((item) => item); - } else { - _queryParams.query = query; - } - - if (Array.isArray(number_)) { - _queryParams.number = number_.map((item) => item.toString()); - } else { - _queryParams.number = number_.toString(); - } - - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/params", - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); - } - - /** - * GET with path and query params - * - * @param {string} param - * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithPathAndQuery("param", { - * query: "query" - * }) - */ - public getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); - } - - private async __getWithPathAndQuery( - param: string, - request: SeedExhaustive.endpoints.GetWithPathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * GET with path and query params - * - * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.getWithInlinePathAndQuery({ - * param: "param", - * query: "query" - * }) - */ - public getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); - } - - private async __getWithInlinePathAndQuery( - request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, query } = request; - const _queryParams: Record = {}; - _queryParams.query = query; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path-query/${core.url.encodePathParam(param)}`, - ), - method: "GET", - headers: _headers, - queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); - } - - /** - * PUT to update with path param - * - * @param {string} param - * @param {string} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithPath("param", "string") - */ - public modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); - } - - private async __modifyWithPath( - param: string, - request: string, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithPath.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithPath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } - - /** - * PUT to update with path param - * - * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request - * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.params.modifyWithInlinePath({ - * param: "param", - * body: "string" - * }) - */ - public modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); - } - - private async __modifyWithInlinePath( - request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, - requestOptions?: ParamsClient.RequestOptions, - ): Promise> { - const { param, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `/params/path/${core.url.encodePathParam(param)}`, - ), - method: "PUT", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.params.modifyWithInlinePath.Request.jsonOrThrow(_body, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.params.modifyWithInlinePath.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts deleted file mode 100644 index 473165eb1638..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param" - * } - */ -export interface GetWithInlinePath { - param: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts deleted file mode 100644 index 9c674a852dce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * query: "query" - * } - */ -export interface GetWithInlinePathAndQuery { - param: string; - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts deleted file mode 100644 index baca4fafbe62..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithMultipleQuery { - query: string | string[]; - number: number | number[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts deleted file mode 100644 index c3f0018a7874..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query" - * } - */ -export interface GetWithPathAndQuery { - query: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts deleted file mode 100644 index 7ad48dee4508..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * query: "query", - * number: 1 - * } - */ -export interface GetWithQuery { - query: string; - number: number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts deleted file mode 100644 index f3f91a06e3f8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * param: "param", - * body: "string" - * } - */ -export interface ModifyResourceAtInlinedPath { - param: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts deleted file mode 100644 index b059d3702a32..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { GetWithInlinePath } from "./GetWithInlinePath.js"; -export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; -export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; -export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; -export type { GetWithQuery } from "./GetWithQuery.js"; -export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts deleted file mode 100644 index 22ff4d032983..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts +++ /dev/null @@ -1,644 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace PrimitiveClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PrimitiveClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PrimitiveClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnString("string") - */ - public getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); - } - - private async __getAndReturnString( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/string", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnString.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnString.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnInt(1) - */ - public getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); - } - - private async __getAndReturnInt( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/integer", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnInt.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnInt.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnLong(1000000) - */ - public getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); - } - - private async __getAndReturnLong( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/long", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnLong.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnLong.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); - } - - /** - * @param {number} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDouble(1.1) - */ - public getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); - } - - private async __getAndReturnDouble( - request: number, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/double", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDouble.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDouble.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); - } - - /** - * @param {boolean} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBool(true) - */ - public getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); - } - - private async __getAndReturnBool( - request: boolean, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/boolean", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBool.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBool.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); - } - - /** - * @param {Date} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) - */ - public getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); - } - - private async __getAndReturnDatetime( - request: Date, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/datetime", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDatetime.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDatetime.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnDate("2023-01-15") - */ - public getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); - } - - private async __getAndReturnDate( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/date", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnDate.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnDate.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") - */ - public getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); - } - - private async __getAndReturnUuid( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/uuid", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnUuid.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnUuid.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); - } - - /** - * @param {string} request - * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") - */ - public getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); - } - - private async __getAndReturnBase64( - request: string, - requestOptions?: PrimitiveClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/primitive/base64", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.endpoints.primitive.getAndReturnBase64.Request.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.primitive.getAndReturnBase64.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts deleted file mode 100644 index d3c0b566a0e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts +++ /dev/null @@ -1,90 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace PutClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class PutClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: PutClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.endpoints.PutRequest} request - * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.put.add({ - * id: "id" - * }) - */ - public add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); - } - - private async __add( - request: SeedExhaustive.endpoints.PutRequest, - requestOptions?: PutClient.RequestOptions, - ): Promise> { - const { id } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - `${core.url.encodePathParam(id)}`, - ), - method: "PUT", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.PutResponse.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts deleted file mode 100644 index 2beba9f087cc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * id: "id" - * } - */ -export interface PutRequest { - id: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts deleted file mode 100644 index dba0eda4bbee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts deleted file mode 100644 index d9adb1af9a93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./client/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index a197fec87887..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCategory = { - ApiError: "API_ERROR", - AuthenticationError: "AUTHENTICATION_ERROR", - InvalidRequestError: "INVALID_REQUEST_ERROR", -} as const; -export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index 3943226222d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,16 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const ErrorCode = { - InternalServerError: "INTERNAL_SERVER_ERROR", - Unauthorized: "UNAUTHORIZED", - Forbidden: "FORBIDDEN", - BadRequest: "BAD_REQUEST", - Conflict: "CONFLICT", - Gone: "GONE", - UnprocessableEntity: "UNPROCESSABLE_ENTITY", - NotImplemented: "NOT_IMPLEMENTED", - BadGateway: "BAD_GATEWAY", - ServiceUnavailable: "SERVICE_UNAVAILABLE", - Unknown: "Unknown", -} as const; -export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 9cf9f495a09a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface Error_ { - category: SeedExhaustive.endpoints.ErrorCategory; - code: SeedExhaustive.endpoints.ErrorCode; - detail?: string; - field?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 628b46ba7298..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface PutResponse { - errors?: SeedExhaustive.endpoints.Error_[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts deleted file mode 100644 index 8ebfb6371c4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts +++ /dev/null @@ -1,97 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export declare namespace UnionClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UnionClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UnionClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.types.Animal} request - * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.union.getAndReturnUnion({ - * animal: "dog", - * name: "name", - * likesToWoof: true - * }) - */ - public getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); - } - - private async __getAndReturnUnion( - request: SeedExhaustive.types.Animal, - requestOptions?: UnionClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/union", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.types.Animal.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.Animal.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts deleted file mode 100644 index 6eee97a8bd78..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts +++ /dev/null @@ -1,247 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../../../core/headers.js"; -import * as core from "../../../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../../../errors/index.js"; -import * as serializers from "../../../../../../serialization/index.js"; - -export declare namespace UrlsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class UrlsClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: UrlsClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withMixedCase() - */ - public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); - } - - private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/MixedCase", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withMixedCase.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.noEndingSlash() - */ - public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); - } - - private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/no-ending-slash", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.noEndingSlash.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withEndingSlash() - */ - public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); - } - - private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with-ending-slash/", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withEndingSlash.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); - } - - /** - * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.endpoints.urls.withUnderscores() - */ - public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); - } - - private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/urls/with_underscores", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.endpoints.urls.withUnderscores.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts deleted file mode 100644 index 6c0020d2b75a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../core/index.js"; -import * as errors from "../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export class BadRequestBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { - super({ - message: "BadRequestBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts deleted file mode 100644 index 61778bda5417..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index 6ad426742488..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface BadObjectRequestInfo { - message: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts deleted file mode 100644 index 3ca611c9fb54..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * from "./generalErrors/errors/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * from "./reqWithHeaders/client/requests/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts deleted file mode 100644 index 08c808a10650..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts +++ /dev/null @@ -1,126 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace InlinedRequestsClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class InlinedRequestsClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: InlinedRequestsClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST with custom object in request body, response is an object - * - * @param {SeedExhaustive.PostWithObjectBody} request - * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.inlinedRequests.postWithObjectBodyandResponse({ - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * }) - */ - public postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); - } - - private async __postWithObjectBodyandResponse( - request: SeedExhaustive.PostWithObjectBody, - requestOptions?: InlinedRequestsClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/req-bodies/object", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.PostWithObjectBody.jsonOrThrow(request, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index 15d3f75bc67d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../index.js"; - -/** - * @example - * { - * string: "string", - * integer: 1, - * nestedObject: { - * string: "string", - * integer: 1, - * long: 1000000, - * double: 1.1, - * bool: true, - * datetime: new Date("2024-01-15T09:30:00.000Z"), - * date: "2023-01-15", - * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - * base64: "SGVsbG8gd29ybGQh", - * list: ["list", "list"], - * set: new Set(["set"]), - * map: { - * 1: "map" - * }, - * bigint: "1000000" - * } - * } - */ -export interface PostWithObjectBody { - string: string; - integer: number; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index 104f84256770..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts deleted file mode 100644 index 52430c224d0b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts +++ /dev/null @@ -1,105 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoAuthClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoAuthClient { - protected readonly _options: NormalizedClientOptions; - - constructor(options: NoAuthClient.Options) { - this._options = normalizeClientOptions(options); - } - - /** - * POST request with no auth - * - * @param {unknown} request - * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @throws {@link SeedExhaustive.BadRequestBody} - * - * @example - * await client.noAuth.postWithNoAuth({ - * "key": "value" - * }) - */ - public postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); - } - - private async __postWithNoAuth( - request?: unknown, - requestOptions?: NoAuthClient.RequestOptions, - ): Promise> { - const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-auth", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: request, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noAuth.postWithNoAuth.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - switch (_response.error.statusCode) { - case 400: - throw new SeedExhaustive.BadRequestBody( - serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - _response.rawResponse, - ); - default: - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts deleted file mode 100644 index 055fc0084e37..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts +++ /dev/null @@ -1,142 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace NoReqBodyClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class NoReqBodyClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: NoReqBodyClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.getWithNoRequestBody() - */ - public getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); - } - - private async __getWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "GET", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); - } - - /** - * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.noReqBody.postWithNoRequestBody() - */ - public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); - } - - private async __postWithNoRequestBody( - requestOptions?: NoReqBodyClient.RequestOptions, - ): Promise> { - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/no-req-body", - ), - method: "POST", - headers: _headers, - queryParameters: requestOptions?.queryParams, - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { - data: serializers.noReqBody.postWithNoRequestBody.Response.parseOrThrow(_response.body, { - unrecognizedObjectKeys: "passthrough", - allowUnrecognizedUnionMembers: true, - allowUnrecognizedEnumValues: true, - skipValidation: true, - breadcrumbsPrefix: ["response"], - }), - rawResponse: _response.rawResponse, - }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts deleted file mode 100644 index cb0ff5c3b541..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts deleted file mode 100644 index a645609a3c92..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts +++ /dev/null @@ -1,93 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; -import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; -import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; -import * as core from "../../../../core/index.js"; -import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; -import * as errors from "../../../../errors/index.js"; -import * as serializers from "../../../../serialization/index.js"; -import type * as SeedExhaustive from "../../../index.js"; - -export declare namespace ReqWithHeadersClient { - export interface Options extends BaseClientOptions {} - - export interface RequestOptions extends BaseRequestOptions {} -} - -export class ReqWithHeadersClient { - protected readonly _options: NormalizedClientOptionsWithAuth; - - constructor(options: ReqWithHeadersClient.Options) { - this._options = normalizeClientOptionsWithAuth(options); - } - - /** - * @param {SeedExhaustive.ReqWithHeaders} request - * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. - * - * @example - * await client.reqWithHeaders.getWithCustomHeader({ - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * }) - */ - public getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): core.HttpResponsePromise { - return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); - } - - private async __getWithCustomHeader( - request: SeedExhaustive.ReqWithHeaders, - requestOptions?: ReqWithHeadersClient.RequestOptions, - ): Promise> { - const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; - const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); - const _headers: core.Fetcher.Args["headers"] = mergeHeaders( - _authRequest.headers, - this._options?.headers, - mergeOnlyDefinedHeaders({ - "X-TEST-SERVICE-HEADER": xTestServiceHeader, - "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, - }), - requestOptions?.headers, - ); - const _response = await core.fetcher({ - url: core.url.join( - (await core.Supplier.get(this._options.baseUrl)) ?? - (await core.Supplier.get(this._options.environment)), - "/test-headers/custom-header", - ), - method: "POST", - headers: _headers, - contentType: "application/json", - queryParameters: requestOptions?.queryParams, - requestType: "json", - body: serializers.reqWithHeaders.getWithCustomHeader.Request.jsonOrThrow(_body, { - unrecognizedObjectKeys: "strip", - omitUndefined: true, - }), - timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, - maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, - abortSignal: requestOptions?.abortSignal, - fetchFn: this._options?.fetch, - logging: this._options.logging, - }); - if (_response.ok) { - return { data: undefined, rawResponse: _response.rawResponse }; - } - - if (_response.error.reason === "status-code") { - throw new errors.SeedExhaustiveError({ - statusCode: _response.error.statusCode, - body: _response.error.body, - rawResponse: _response.rawResponse, - }); - } - - return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts deleted file mode 100644 index b7fce3790bf5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -/** - * @example - * { - * xTestServiceHeader: "X-TEST-SERVICE-HEADER", - * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - * body: "string" - * } - */ -export interface ReqWithHeaders { - xTestServiceHeader: string; - xTestEndpointHeader: string; - body: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts deleted file mode 100644 index 5419b56cd667..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index ed458c66ba3c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,66 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithDocs { - /** - * Characters that could lead to broken generated SDKs: - * - * Markdown Escapes: - * - \_: Escaped underscore (e.g., FOO\_BAR) - * - \*: Escaped asterisk - * - * JSDoc (JavaScript/TypeScript): - * - @: Used for JSDoc tags - * - {: }: Used for type definitions - * - <: >: HTML tags - * - *: Can interfere with comment blocks - * - /**: JSDoc comment start - * - ** /: JSDoc comment end - * - &: HTML entities - * - * XMLDoc (C#): - * - <: >: XML tags - * - &: ': ": <: >: XML special characters - * - {: }: Used for interpolated strings - * - ///: Comment marker - * - /**: Block comment start - * - ** /: Block comment end - * - * Javadoc (Java): - * - @: Used for Javadoc tags - * - <: >: HTML tags - * - &: HTML entities - * - *: Can interfere with comment blocks - * - /**: Javadoc comment start - * - ** /: Javadoc comment end - * - * Doxygen (C++): - * - \: Used for Doxygen commands - * - @: Alternative command prefix - * - <: >: XML/HTML tags - * - &: HTML entities - * - /**: C-style comment start - * - ** /: C-style comment end - * - * RDoc (Ruby): - * - :: Used in symbol notation - * - =: Section markers - * - #: Comment marker - * - =begin: Block comment start - * - =end: Block comment end - * - @: Instance variable prefix - * - $: Global variable prefix - * - %: String literal delimiter - * - #{: String interpolation start - * - }: String interpolation end - * - * PHPDoc (PHP): - * - @: Used for PHPDoc tags - * - {: }: Used for type definitions - * - $: Variable prefix - * - /**: PHPDoc comment start - * - ** /: PHPDoc comment end - * - *: Can interfere with comment blocks - * - &: HTML entities - */ - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts deleted file mode 100644 index ef1aee2d386e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithEnumBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithEnumBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts deleted file mode 100644 index 203651bfb712..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index 4023a0068946..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,9 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export const WeatherReport = { - Sunny: "SUNNY", - Cloudy: "CLOUDY", - Raining: "RAINING", - Snowing: "SNOWING", -} as const; -export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts deleted file mode 100644 index c2a44b58ecd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * from "./enum/errors/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * from "./object/errors/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * from "./union/errors/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts deleted file mode 100644 index 2681788e4f04..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts deleted file mode 100644 index 203710315112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "NestedObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts deleted file mode 100644 index 230964f8467f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithOptionalFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts deleted file mode 100644 index b8a86dc99dd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { - super({ - message: "ObjectWithRequiredFieldError", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts deleted file mode 100644 index e38a83090455..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./NestedObjectWithOptionalFieldError.js"; -export * from "./NestedObjectWithRequiredFieldError.js"; -export * from "./ObjectWithOptionalFieldError.js"; -export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index 4898ba728836..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface DoubleOptional { - optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index 324bb2e73908..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithOptionalField { - string?: string; - nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index 322dcfbd5c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,8 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export interface NestedObjectWithRequiredField { - string: string; - nestedObject: SeedExhaustive.types.ObjectWithOptionalField; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index b35138a717bb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithMapOfMap { - map: Record>; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 2e6b3811b575..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithOptionalField { - /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ - string?: string; - integer?: number; - long?: number; - double?: number; - bool?: boolean; - datetime?: Date; - date?: string; - uuid?: string; - base64?: string; - list?: string[]; - set?: Set; - map?: Record; - bigint?: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index 032a84135c9e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface ObjectWithRequiredField { - string: string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index 5dac5b761df8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts deleted file mode 100644 index c0e5b750495f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../../../../../../core/index.js"; -import * as errors from "../../../../../../errors/index.js"; -import type * as SeedExhaustive from "../../../../../index.js"; - -export class ErrorWithUnionBody extends errors.SeedExhaustiveError { - constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { - super({ - message: "ErrorWithUnionBody", - statusCode: 400, - body: body, - rawResponse: rawResponse, - }); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts deleted file mode 100644 index 940b191924ee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts deleted file mode 100644 index 38688e58bd6f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./errors/index.js"; -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index f5336c6b33bc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../index.js"; - -export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; - -export namespace Animal { - export interface Dog extends SeedExhaustive.types.Dog { - animal: "dog"; - } - - export interface Cat extends SeedExhaustive.types.Cat { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index aa74d5b7dd01..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Cat { - name: string; - likesToMeow: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 24bc9aa321b1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export interface Dog { - name: string; - likesToWoof: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts deleted file mode 100644 index b556b3f7bd94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts +++ /dev/null @@ -1,35 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../core/index.js"; -import * as errors from "../errors/index.js"; - -export namespace BearerAuthProvider { - export interface Options { - token?: core.Supplier; - } -} - -export class BearerAuthProvider implements core.AuthProvider { - private readonly token: core.Supplier; - - constructor(options: BearerAuthProvider.Options) { - this.token = options.token; - } - - public static canCreate(options: BearerAuthProvider.Options): boolean { - return options.token != null; - } - - public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { - const token = await core.Supplier.get(this.token); - if (token == null) { - throw new errors.SeedExhaustiveError({ - message: "Please specify a token by passing it in to the constructor", - }); - } - - return { - headers: { Authorization: `Bearer ${token}` }, - }; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts deleted file mode 100644 index 0ecb12b79bdb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts deleted file mode 100644 index 895a50ff30da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export interface AuthProvider { - getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts deleted file mode 100644 index f6218b42211e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Request parameters for authentication requests. - */ -export interface AuthRequest { - /** - * The headers to be included in the request. - */ - headers: Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts deleted file mode 100644 index a64235910062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { base64Decode, base64Encode } from "../base64.js"; - -export interface BasicAuth { - username: string; - password: string; -} - -const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; - -export const BasicAuth = { - toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { - if (basicAuth == null) { - return undefined; - } - const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); - return `Basic ${token}`; - }, - fromAuthorizationHeader: (header: string): BasicAuth => { - const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); - const decoded = base64Decode(credentials); - const [username, ...passwordParts] = decoded.split(":"); - const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; - - if (username == null || password == null) { - throw new Error("Invalid basic auth"); - } - return { - username, - password, - }; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts deleted file mode 100644 index c44a06c38f06..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type BearerToken = string; - -const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; - -function toAuthorizationHeader(token: string | undefined): string | undefined { - if (token == null) { - return undefined; - } - return `Bearer ${token}`; -} - -export const BearerToken: { - toAuthorizationHeader: typeof toAuthorizationHeader; - fromAuthorizationHeader: (header: string) => BearerToken; -} = { - toAuthorizationHeader: toAuthorizationHeader, - fromAuthorizationHeader: (header: string): BearerToken => { - return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts deleted file mode 100644 index 5b7acfd2bd8b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { AuthProvider } from "./AuthProvider.js"; -import type { AuthRequest } from "./AuthRequest.js"; - -export class NoOpAuthProvider implements AuthProvider { - public getAuthRequest(): Promise { - return Promise.resolve({ headers: {} }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts deleted file mode 100644 index 2215b227709e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type { AuthProvider } from "./AuthProvider.js"; -export type { AuthRequest } from "./AuthRequest.js"; -export { BasicAuth } from "./BasicAuth.js"; -export { BearerToken } from "./BearerToken.js"; -export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts deleted file mode 100644 index 448a0db638a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts +++ /dev/null @@ -1,27 +0,0 @@ -function base64ToBytes(base64: string): Uint8Array { - const binString = atob(base64); - return Uint8Array.from(binString, (m) => m.codePointAt(0)!); -} - -function bytesToBase64(bytes: Uint8Array): string { - const binString = String.fromCodePoint(...bytes); - return btoa(binString); -} - -export function base64Encode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "utf8").toString("base64"); - } - - const bytes = new TextEncoder().encode(input); - return bytesToBase64(bytes); -} - -export function base64Decode(input: string): string { - if (typeof Buffer !== "undefined") { - return Buffer.from(input, "base64").toString("utf8"); - } - - const bytes = base64ToBytes(input); - return new TextDecoder().decode(bytes); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts deleted file mode 100644 index 69296d7100d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts deleted file mode 100644 index 97ab83c2b195..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { RawResponse } from "./RawResponse.js"; - -/** - * The response of an API call. - * It is a successful response or a failed response. - */ -export type APIResponse = SuccessfulResponse | FailedResponse; - -export interface SuccessfulResponse { - ok: true; - body: T; - /** - * @deprecated Use `rawResponse` instead - */ - headers?: Record; - rawResponse: RawResponse; -} - -export interface FailedResponse { - ok: false; - error: T; - rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts deleted file mode 100644 index bca7f4c77981..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type BinaryResponse = { - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ - bodyUsed: Response["bodyUsed"]; - /** - * Returns a ReadableStream of the response body. - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) - */ - stream: () => Response["body"]; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ - arrayBuffer: () => ReturnType; - /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ - blob: () => ReturnType; - /** - * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) - * Some versions of the Fetch API may not support this method. - */ - bytes?(): ReturnType; -}; - -export function getBinaryResponse(response: Response): BinaryResponse { - const binaryResponse: BinaryResponse = { - get bodyUsed() { - return response.bodyUsed; - }, - stream: () => response.body, - arrayBuffer: response.arrayBuffer.bind(response), - blob: response.blob.bind(response), - }; - if ("bytes" in response && typeof response.bytes === "function") { - binaryResponse.bytes = response.bytes.bind(response); - } - - return binaryResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts deleted file mode 100644 index 998d68f5c20c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts +++ /dev/null @@ -1,13 +0,0 @@ -export type SecuritySchemeKey = string; -/** - * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. - * All schemes in the collection must be satisfied for authentication to be successful. - */ -export type SecuritySchemeCollection = Record; -export type AuthScope = string; -export type EndpointMetadata = { - /** - * An array of security scheme collections. Each collection represents an alternative way to authenticate. - */ - security?: SecuritySchemeCollection[]; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts deleted file mode 100644 index 8079841c4062..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import type { Supplier } from "./Supplier.js"; - -type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; -export type EndpointSupplier = Supplier | EndpointSupplierFn; -export const EndpointSupplier = { - get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { - if (typeof supplier === "function") { - return (supplier as EndpointSupplierFn)(arg); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts deleted file mode 100644 index 58bb0e3ef7d9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts +++ /dev/null @@ -1,391 +0,0 @@ -import { toJson } from "../json.js"; -import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; -import type { APIResponse } from "./APIResponse.js"; -import { createRequestUrl } from "./createRequestUrl.js"; -import type { EndpointMetadata } from "./EndpointMetadata.js"; -import { EndpointSupplier } from "./EndpointSupplier.js"; -import { getErrorResponseBody } from "./getErrorResponseBody.js"; -import { getFetchFn } from "./getFetchFn.js"; -import { getRequestBody } from "./getRequestBody.js"; -import { getResponseBody } from "./getResponseBody.js"; -import { Headers } from "./Headers.js"; -import { makeRequest } from "./makeRequest.js"; -import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -import { requestWithRetries } from "./requestWithRetries.js"; - -export type FetchFunction = (args: Fetcher.Args) => Promise>; - -export declare namespace Fetcher { - export interface Args { - url: string; - method: string; - contentType?: string; - headers?: Record | null | undefined>; - queryParameters?: Record; - body?: unknown; - timeoutMs?: number; - maxRetries?: number; - withCredentials?: boolean; - abortSignal?: AbortSignal; - requestType?: "json" | "file" | "bytes" | "form" | "other"; - responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; - duplex?: "half"; - endpointMetadata?: EndpointMetadata; - fetchFn?: typeof fetch; - logging?: LogConfig | Logger; - } - - export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; - - export interface FailedStatusCodeError { - reason: "status-code"; - statusCode: number; - body: unknown; - } - - export interface NonJsonError { - reason: "non-json"; - statusCode: number; - rawBody: string; - } - - export interface BodyIsNullError { - reason: "body-is-null"; - statusCode: number; - } - - export interface TimeoutError { - reason: "timeout"; - } - - export interface UnknownError { - reason: "unknown"; - errorMessage: string; - } -} - -const SENSITIVE_HEADERS = new Set([ - "authorization", - "www-authenticate", - "x-api-key", - "api-key", - "apikey", - "x-api-token", - "x-auth-token", - "auth-token", - "cookie", - "set-cookie", - "proxy-authorization", - "proxy-authenticate", - "x-csrf-token", - "x-xsrf-token", - "x-session-token", - "x-access-token", -]); - -function redactHeaders(headers: Headers | Record): Record { - const filtered: Record = {}; - for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { - if (SENSITIVE_HEADERS.has(key.toLowerCase())) { - filtered[key] = "[REDACTED]"; - } else { - filtered[key] = value; - } - } - return filtered; -} - -const SENSITIVE_QUERY_PARAMS = new Set([ - "api_key", - "api-key", - "apikey", - "token", - "access_token", - "access-token", - "auth_token", - "auth-token", - "password", - "passwd", - "secret", - "api_secret", - "api-secret", - "apisecret", - "key", - "session", - "session_id", - "session-id", -]); - -function redactQueryParameters(queryParameters?: Record): Record | undefined { - if (queryParameters == null) { - return queryParameters; - } - const redacted: Record = {}; - for (const [key, value] of Object.entries(queryParameters)) { - if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { - redacted[key] = "[REDACTED]"; - } else { - redacted[key] = value; - } - } - return redacted; -} - -function redactUrl(url: string): string { - const protocolIndex = url.indexOf("://"); - if (protocolIndex === -1) return url; - - const afterProtocol = protocolIndex + 3; - - // Find the first delimiter that marks the end of the authority section - const pathStart = url.indexOf("/", afterProtocol); - let queryStart = url.indexOf("?", afterProtocol); - let fragmentStart = url.indexOf("#", afterProtocol); - - const firstDelimiter = Math.min( - pathStart === -1 ? url.length : pathStart, - queryStart === -1 ? url.length : queryStart, - fragmentStart === -1 ? url.length : fragmentStart, - ); - - // Find the LAST @ before the delimiter (handles multiple @ in credentials) - let atIndex = -1; - for (let i = afterProtocol; i < firstDelimiter; i++) { - if (url[i] === "@") { - atIndex = i; - } - } - - if (atIndex !== -1) { - url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; - } - - // Recalculate queryStart since url might have changed - queryStart = url.indexOf("?"); - if (queryStart === -1) return url; - - fragmentStart = url.indexOf("#", queryStart); - const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; - const queryString = url.slice(queryStart + 1, queryEnd); - - if (queryString.length === 0) return url; - - // FAST PATH: Quick check if any sensitive keywords present - // Using indexOf is faster than regex for simple substring matching - const lower = queryString.toLowerCase(); - const hasSensitive = - lower.includes("token") || - lower.includes("key") || - lower.includes("password") || - lower.includes("passwd") || - lower.includes("secret") || - lower.includes("session") || - lower.includes("auth"); - - if (!hasSensitive) { - return url; - } - - // SLOW PATH: Parse and redact - const redactedParams: string[] = []; - const params = queryString.split("&"); - - for (const param of params) { - const equalIndex = param.indexOf("="); - if (equalIndex === -1) { - redactedParams.push(param); - continue; - } - - const key = param.slice(0, equalIndex); - let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); - - if (!shouldRedact && key.includes("%")) { - try { - const decodedKey = decodeURIComponent(key); - shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); - } catch {} - } - - redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); - } - - return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); -} - -async function getHeaders(args: Fetcher.Args): Promise { - const newHeaders: Headers = new Headers(); - - newHeaders.set( - "Accept", - args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", - ); - if (args.body !== undefined && args.contentType != null) { - newHeaders.set("Content-Type", args.contentType); - } - - if (args.headers == null) { - return newHeaders; - } - - for (const [key, value] of Object.entries(args.headers)) { - const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); - if (typeof result === "string") { - newHeaders.set(key, result); - continue; - } - if (result == null) { - continue; - } - newHeaders.set(key, `${result}`); - } - return newHeaders; -} - -export async function fetcherImpl(args: Fetcher.Args): Promise> { - const url = createRequestUrl(args.url, args.queryParameters); - const requestBody: BodyInit | undefined = await getRequestBody({ - body: args.body, - type: args.requestType ?? "other", - }); - const fetchFn = args.fetchFn ?? (await getFetchFn()); - const headers = await getHeaders(args); - const logger = createLogger(args.logging); - - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - headers: redactHeaders(headers), - queryParameters: redactQueryParameters(args.queryParameters), - hasBody: requestBody != null, - }; - logger.debug("Making HTTP request", metadata); - } - - try { - const response = await requestWithRetries( - async () => - makeRequest( - fetchFn, - url, - args.method, - headers, - requestBody, - args.timeoutMs, - args.abortSignal, - args.withCredentials, - args.duplex, - ), - args.maxRetries, - ); - - if (response.status >= 200 && response.status < 400) { - if (logger.isDebug()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(response.headers), - }; - logger.debug("HTTP request succeeded", metadata); - } - const body = await getResponseBody(response, args.responseType); - return { - ok: true, - body: body as R, - headers: response.headers, - rawResponse: toRawResponse(response), - }; - } else { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - statusCode: response.status, - responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), - }; - logger.error("HTTP request failed with error status", metadata); - } - return { - ok: false, - error: { - reason: "status-code", - statusCode: response.status, - body: await getErrorResponseBody(response), - }, - rawResponse: toRawResponse(response), - }; - } - } catch (error) { - if (args.abortSignal?.aborted) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - }; - logger.error("HTTP request was aborted", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: "The user aborted a request", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error && error.name === "AbortError") { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - timeoutMs: args.timeoutMs, - }; - logger.error("HTTP request timed out", metadata); - } - return { - ok: false, - error: { - reason: "timeout", - }, - rawResponse: abortRawResponse, - }; - } else if (error instanceof Error) { - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - errorMessage: error.message, - }; - logger.error("HTTP request failed with error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: error.message, - }, - rawResponse: unknownRawResponse, - }; - } - - if (logger.isError()) { - const metadata = { - method: args.method, - url: redactUrl(url), - error: toJson(error), - }; - logger.error("HTTP request failed with unknown error", metadata); - } - return { - ok: false, - error: { - reason: "unknown", - errorMessage: toJson(error), - }, - rawResponse: unknownRawResponse, - }; - } -} - -export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts deleted file mode 100644 index af841aa24f55..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts +++ /dev/null @@ -1,93 +0,0 @@ -let Headers: typeof globalThis.Headers; - -if (typeof globalThis.Headers !== "undefined") { - Headers = globalThis.Headers; -} else { - Headers = class Headers implements Headers { - private headers: Map; - - constructor(init?: HeadersInit) { - this.headers = new Map(); - - if (init) { - if (init instanceof Headers) { - init.forEach((value, key) => this.append(key, value)); - } else if (Array.isArray(init)) { - for (const [key, value] of init) { - if (typeof key === "string" && typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Each header entry must be a [string, string] tuple"); - } - } - } else { - for (const [key, value] of Object.entries(init)) { - if (typeof value === "string") { - this.append(key, value); - } else { - throw new TypeError("Header values must be strings"); - } - } - } - } - } - - append(name: string, value: string): void { - const key = name.toLowerCase(); - const existing = this.headers.get(key) || []; - this.headers.set(key, [...existing, value]); - } - - delete(name: string): void { - const key = name.toLowerCase(); - this.headers.delete(key); - } - - get(name: string): string | null { - const key = name.toLowerCase(); - const values = this.headers.get(key); - return values ? values.join(", ") : null; - } - - has(name: string): boolean { - const key = name.toLowerCase(); - return this.headers.has(key); - } - - set(name: string, value: string): void { - const key = name.toLowerCase(); - this.headers.set(key, [value]); - } - - forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { - const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; - this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); - } - - getSetCookie(): string[] { - return this.headers.get("set-cookie") || []; - } - - *entries(): HeadersIterator<[string, string]> { - for (const [key, values] of this.headers.entries()) { - yield [key, values.join(", ")]; - } - } - - *keys(): HeadersIterator { - yield* this.headers.keys(); - } - - *values(): HeadersIterator { - for (const values of this.headers.values()) { - yield values.join(", "); - } - } - - [Symbol.iterator](): HeadersIterator<[string, string]> { - return this.entries(); - } - }; -} - -export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts deleted file mode 100644 index 692ca7d795f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { WithRawResponse } from "./RawResponse.js"; - -/** - * A promise that returns the parsed response and lets you retrieve the raw response too. - */ -export class HttpResponsePromise extends Promise { - private innerPromise: Promise>; - private unwrappedPromise: Promise | undefined; - - private constructor(promise: Promise>) { - // Initialize with a no-op to avoid premature parsing - super((resolve) => { - resolve(undefined as unknown as T); - }); - this.innerPromise = promise; - } - - /** - * Creates an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @param args - Arguments to pass to the function. - * @returns An `HttpResponsePromise` instance. - */ - public static fromFunction Promise>, T>( - fn: F, - ...args: Parameters - ): HttpResponsePromise { - return new HttpResponsePromise(fn(...args)); - } - - /** - * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. - * - * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. - * @returns A function that returns an `HttpResponsePromise` instance. - */ - public static interceptFunction< - F extends (...args: never[]) => Promise>, - T = Awaited>["data"], - >(fn: F): (...args: Parameters) => HttpResponsePromise { - return (...args: Parameters): HttpResponsePromise => { - return HttpResponsePromise.fromPromise(fn(...args)); - }; - } - - /** - * Creates an `HttpResponsePromise` from an existing promise. - * - * @param promise - A promise resolving to a `WithRawResponse` object. - * @returns An `HttpResponsePromise` instance. - */ - public static fromPromise(promise: Promise>): HttpResponsePromise { - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from an executor function. - * - * @param executor - A function that takes resolve and reject callbacks to create a promise. - * @returns An `HttpResponsePromise` instance. - */ - public static fromExecutor( - executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, - ): HttpResponsePromise { - const promise = new Promise>(executor); - return new HttpResponsePromise(promise); - } - - /** - * Creates an `HttpResponsePromise` from a resolved result. - * - * @param result - A `WithRawResponse` object to resolve immediately. - * @returns An `HttpResponsePromise` instance. - */ - public static fromResult(result: WithRawResponse): HttpResponsePromise { - const promise = Promise.resolve(result); - return new HttpResponsePromise(promise); - } - - private unwrap(): Promise { - if (!this.unwrappedPromise) { - this.unwrappedPromise = this.innerPromise.then(({ data }) => data); - } - return this.unwrappedPromise; - } - - /** @inheritdoc */ - public override then( - onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, - ): Promise { - return this.unwrap().then(onfulfilled, onrejected); - } - - /** @inheritdoc */ - public override catch( - onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, - ): Promise { - return this.unwrap().catch(onrejected); - } - - /** @inheritdoc */ - public override finally(onfinally?: (() => void) | null): Promise { - return this.unwrap().finally(onfinally); - } - - /** - * Retrieves the data and raw response. - * - * @returns A promise resolving to a `WithRawResponse` object. - */ - public async withRawResponse(): Promise> { - return await this.innerPromise; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts deleted file mode 100644 index 37fb44e2aa99..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Headers } from "./Headers.js"; - -/** - * The raw response from the fetch call excluding the body. - */ -export type RawResponse = Omit< - { - [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions - }, - "ok" | "body" | "bodyUsed" ->; // strips out body and bodyUsed - -/** - * A raw response indicating that the request was aborted. - */ -export const abortRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 499, - statusText: "Client Closed Request", - type: "error", - url: "", -} as const; - -/** - * A raw response indicating an unknown error. - */ -export const unknownRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 0, - statusText: "Unknown Error", - type: "error", - url: "", -} as const; - -/** - * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, - * excluding the `body` and `bodyUsed` fields. - * - * @param response - The `RawResponse` object to convert. - * @returns A `RawResponse` object containing the extracted properties of the input response. - */ -export function toRawResponse(response: Response): RawResponse { - return { - headers: response.headers, - redirected: response.redirected, - status: response.status, - statusText: response.statusText, - type: response.type, - url: response.url, - }; -} - -/** - * Creates a `RawResponse` from a standard `Response` object. - */ -export interface WithRawResponse { - readonly data: T; - readonly rawResponse: RawResponse; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts deleted file mode 100644 index 867c931c02f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type Supplier = T | Promise | (() => T | Promise); - -export const Supplier = { - get: async (supplier: Supplier): Promise => { - if (typeof supplier === "function") { - return (supplier as () => T)(); - } else { - return supplier; - } - }, -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts deleted file mode 100644 index 88e13265e112..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { toQueryString } from "../url/qs.js"; - -export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { - const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); - return queryString ? `${baseUrl}?${queryString}` : baseUrl; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts deleted file mode 100644 index 7cf4e623c2f5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { fromJson } from "../json.js"; -import { getResponseBody } from "./getResponseBody.js"; - -export async function getErrorResponseBody(response: Response): Promise { - let contentType = response.headers.get("Content-Type")?.toLowerCase(); - if (contentType == null || contentType.length === 0) { - return getResponseBody(response); - } - - if (contentType.indexOf(";") !== -1) { - contentType = contentType.split(";")[0]?.trim() ?? ""; - } - switch (contentType) { - case "application/hal+json": - case "application/json": - case "application/ld+json": - case "application/problem+json": - case "application/vnd.api+json": - case "text/json": { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - default: - if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { - const text = await response.text(); - return text.length > 0 ? fromJson(text) : undefined; - } - - // Fallback to plain text if content type is not recognized - // Even if no body is present, the response will be an empty string - return await response.text(); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts deleted file mode 100644 index 9f845b956392..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts +++ /dev/null @@ -1,3 +0,0 @@ -export async function getFetchFn(): Promise { - return fetch; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts deleted file mode 100644 index 50f922b0e87f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts +++ /dev/null @@ -1,8 +0,0 @@ -export function getHeader(headers: Record, header: string): string | undefined { - for (const [headerKey, headerValue] of Object.entries(headers)) { - if (headerKey.toLowerCase() === header.toLowerCase()) { - return headerValue; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts deleted file mode 100644 index 91d9d81f50e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toJson } from "../json.js"; -import { toQueryString } from "../url/qs.js"; - -export declare namespace GetRequestBody { - interface Args { - body: unknown; - type: "json" | "file" | "bytes" | "form" | "other"; - } -} - -export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { - if (type === "form") { - return toQueryString(body, { arrayFormat: "repeat", encode: true }); - } - if (type.includes("json")) { - return toJson(body); - } else { - return body as BodyInit; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts deleted file mode 100644 index 708d55728f2b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { fromJson } from "../json.js"; -import { getBinaryResponse } from "./BinaryResponse.js"; - -export async function getResponseBody(response: Response, responseType?: string): Promise { - switch (responseType) { - case "binary-response": - return getBinaryResponse(response); - case "blob": - return await response.blob(); - case "arrayBuffer": - return await response.arrayBuffer(); - case "sse": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - return response.body; - case "streaming": - if (response.body == null) { - return { - ok: false, - error: { - reason: "body-is-null", - statusCode: response.status, - }, - }; - } - - return response.body; - - case "text": - return await response.text(); - } - - // if responseType is "json" or not specified, try to parse as JSON - const text = await response.text(); - if (text.length > 0) { - try { - const responseBody = fromJson(text); - return responseBody; - } catch (_err) { - return { - ok: false, - error: { - reason: "non-json", - statusCode: response.status, - rawBody: text, - }, - }; - } - } - return undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts deleted file mode 100644 index c3bc6da20f49..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type { APIResponse } from "./APIResponse.js"; -export type { BinaryResponse } from "./BinaryResponse.js"; -export type { EndpointMetadata } from "./EndpointMetadata.js"; -export { EndpointSupplier } from "./EndpointSupplier.js"; -export type { Fetcher, FetchFunction } from "./Fetcher.js"; -export { fetcher } from "./Fetcher.js"; -export { getHeader } from "./getHeader.js"; -export { HttpResponsePromise } from "./HttpResponsePromise.js"; -export type { RawResponse, WithRawResponse } from "./RawResponse.js"; -export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; -export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts deleted file mode 100644 index 921565eb0063..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { anySignal, getTimeoutSignal } from "./signals.js"; - -export const makeRequest = async ( - fetchFn: (url: string, init: RequestInit) => Promise, - url: string, - method: string, - headers: Headers | Record, - requestBody: BodyInit | undefined, - timeoutMs?: number, - abortSignal?: AbortSignal, - withCredentials?: boolean, - duplex?: "half", -): Promise => { - const signals: AbortSignal[] = []; - - let timeoutAbortId: ReturnType | undefined; - if (timeoutMs != null) { - const { signal, abortId } = getTimeoutSignal(timeoutMs); - timeoutAbortId = abortId; - signals.push(signal); - } - - if (abortSignal != null) { - signals.push(abortSignal); - } - const newSignals = anySignal(signals); - const response = await fetchFn(url, { - method: method, - headers, - body: requestBody, - signal: newSignals, - credentials: withCredentials ? "include" : undefined, - // @ts-ignore - duplex, - }); - - if (timeoutAbortId != null) { - clearTimeout(timeoutAbortId); - } - - return response; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts deleted file mode 100644 index 1f689688c4b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts +++ /dev/null @@ -1,64 +0,0 @@ -const INITIAL_RETRY_DELAY = 1000; // in milliseconds -const MAX_RETRY_DELAY = 60000; // in milliseconds -const DEFAULT_MAX_RETRIES = 2; -const JITTER_FACTOR = 0.2; // 20% random jitter - -function addPositiveJitter(delay: number): number { - const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function addSymmetricJitter(delay: number): number { - const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; - return delay * jitterMultiplier; -} - -function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { - const retryAfter = response.headers.get("Retry-After"); - if (retryAfter) { - const retryAfterSeconds = parseInt(retryAfter, 10); - if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { - return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); - } - - const retryAfterDate = new Date(retryAfter); - if (!Number.isNaN(retryAfterDate.getTime())) { - const delay = retryAfterDate.getTime() - Date.now(); - if (delay > 0) { - return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); - } - } - } - - const rateLimitReset = response.headers.get("X-RateLimit-Reset"); - if (rateLimitReset) { - const resetTime = parseInt(rateLimitReset, 10); - if (!Number.isNaN(resetTime)) { - const delay = resetTime * 1000 - Date.now(); - if (delay > 0) { - return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); - } - } - } - - return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); -} - -export async function requestWithRetries( - requestFn: () => Promise, - maxRetries: number = DEFAULT_MAX_RETRIES, -): Promise { - let response: Response = await requestFn(); - - for (let i = 0; i < maxRetries; ++i) { - if ([408, 429].includes(response.status) || response.status >= 500) { - const delay = getRetryDelayFromHeaders(response, i); - - await new Promise((resolve) => setTimeout(resolve, delay)); - response = await requestFn(); - } else { - break; - } - } - return response!; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts deleted file mode 100644 index 7bd3757ec3a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts +++ /dev/null @@ -1,26 +0,0 @@ -const TIMEOUT = "timeout"; - -export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { - const controller = new AbortController(); - const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); - return { signal: controller.signal, abortId }; -} - -export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { - const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; - - const controller = new AbortController(); - - for (const signal of signals) { - if (signal.aborted) { - controller.abort((signal as any)?.reason); - break; - } - - signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { - signal: controller.signal, - }); - } - - return controller.signal; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts deleted file mode 100644 index 78ed8b500c95..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts +++ /dev/null @@ -1,35 +0,0 @@ -export function mergeHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } else if (insensitiveKey in result) { - delete result[insensitiveKey]; - } - } - - return result; -} - -export function mergeOnlyDefinedHeaders( - ...headersArray: (Record | null | undefined)[] -): Record { - const result: Record = {}; - - for (const [key, value] of headersArray - .filter((headers) => headers != null) - .flatMap((headers) => Object.entries(headers))) { - const insensitiveKey = key.toLowerCase(); - if (value != null) { - result[insensitiveKey] = value; - } - } - - return result; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts deleted file mode 100644 index 874173e71808..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./auth/index.js"; -export * from "./base64.js"; -export * from "./fetcher/index.js"; -export * as logging from "./logging/index.js"; -export * from "./runtime/index.js"; -export * as serialization from "./schemas/index.js"; -export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts deleted file mode 100644 index c052f3249f4f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Serialize a value to JSON - * @param value A JavaScript value, usually an object or array, to be converted. - * @param replacer A function that transforms the results. - * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. - * @returns JSON string - */ -export const toJson = ( - value: unknown, - replacer?: (this: unknown, key: string, value: unknown) => unknown, - space?: string | number, -): string => { - return JSON.stringify(value, replacer, space); -}; - -/** - * Parse JSON string to object, array, or other type - * @param text A valid JSON string. - * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. - * @returns Parsed object, array, or other type - */ -export function fromJson( - text: string, - reviver?: (this: unknown, key: string, value: unknown) => unknown, -): T { - return JSON.parse(text, reviver); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts deleted file mode 100644 index 88f6c00db0cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as logger from "./logger.js"; - -export namespace logging { - /** - * Configuration for logger instances. - */ - export type LogConfig = logger.LogConfig; - export type LogLevel = logger.LogLevel; - export const LogLevel: typeof logger.LogLevel = logger.LogLevel; - export type ILogger = logger.ILogger; - /** - * Console logger implementation that outputs to the console. - */ - export type ConsoleLogger = logger.ConsoleLogger; - /** - * Console logger implementation that outputs to the console. - */ - export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts deleted file mode 100644 index d81cc32c40f9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts deleted file mode 100644 index a3f3673cda93..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts +++ /dev/null @@ -1,203 +0,0 @@ -export const LogLevel = { - Debug: "debug", - Info: "info", - Warn: "warn", - Error: "error", -} as const; -export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; -const logLevelMap: Record = { - [LogLevel.Debug]: 1, - [LogLevel.Info]: 2, - [LogLevel.Warn]: 3, - [LogLevel.Error]: 4, -}; - -export interface ILogger { - /** - * Logs a debug message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - debug(message: string, ...args: unknown[]): void; - /** - * Logs an info message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - info(message: string, ...args: unknown[]): void; - /** - * Logs a warning message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - warn(message: string, ...args: unknown[]): void; - /** - * Logs an error message. - * @param message - The message to log - * @param args - Additional arguments to log - */ - error(message: string, ...args: unknown[]): void; -} - -/** - * Configuration for logger initialization. - */ -export interface LogConfig { - /** - * Minimum log level to output. - * @default LogLevel.Info - */ - level?: LogLevel; - /** - * Logger implementation to use. - * @default new ConsoleLogger() - */ - logger?: ILogger; - /** - * Whether logging should be silenced. - * @default true - */ - silent?: boolean; -} - -/** - * Default console-based logger implementation. - */ -export class ConsoleLogger implements ILogger { - debug(message: string, ...args: unknown[]): void { - console.debug(message, ...args); - } - info(message: string, ...args: unknown[]): void { - console.info(message, ...args); - } - warn(message: string, ...args: unknown[]): void { - console.warn(message, ...args); - } - error(message: string, ...args: unknown[]): void { - console.error(message, ...args); - } -} - -/** - * Logger class that provides level-based logging functionality. - */ -export class Logger { - private readonly level: number; - private readonly logger: ILogger; - private readonly silent: boolean; - - /** - * Creates a new logger instance. - * @param config - Logger configuration - */ - constructor(config: Required) { - this.level = logLevelMap[config.level]; - this.logger = config.logger; - this.silent = config.silent; - } - - /** - * Checks if a log level should be output based on configuration. - * @param level - The log level to check - * @returns True if the level should be logged - */ - public shouldLog(level: LogLevel): boolean { - return !this.silent && this.level <= logLevelMap[level]; - } - - /** - * Checks if debug logging is enabled. - * @returns True if debug logs should be output - */ - public isDebug(): boolean { - return this.shouldLog(LogLevel.Debug); - } - - /** - * Logs a debug message if debug logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public debug(message: string, ...args: unknown[]): void { - if (this.isDebug()) { - this.logger.debug(message, ...args); - } - } - - /** - * Checks if info logging is enabled. - * @returns True if info logs should be output - */ - public isInfo(): boolean { - return this.shouldLog(LogLevel.Info); - } - - /** - * Logs an info message if info logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public info(message: string, ...args: unknown[]): void { - if (this.isInfo()) { - this.logger.info(message, ...args); - } - } - - /** - * Checks if warning logging is enabled. - * @returns True if warning logs should be output - */ - public isWarn(): boolean { - return this.shouldLog(LogLevel.Warn); - } - - /** - * Logs a warning message if warning logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public warn(message: string, ...args: unknown[]): void { - if (this.isWarn()) { - this.logger.warn(message, ...args); - } - } - - /** - * Checks if error logging is enabled. - * @returns True if error logs should be output - */ - public isError(): boolean { - return this.shouldLog(LogLevel.Error); - } - - /** - * Logs an error message if error logging is enabled. - * @param message - The message to log - * @param args - Additional arguments to log - */ - public error(message: string, ...args: unknown[]): void { - if (this.isError()) { - this.logger.error(message, ...args); - } - } -} - -export function createLogger(config?: LogConfig | Logger): Logger { - if (config == null) { - return defaultLogger; - } - if (config instanceof Logger) { - return config; - } - config = config ?? {}; - config.level ??= LogLevel.Info; - config.logger ??= new ConsoleLogger(); - config.silent ??= true; - return new Logger(config as Required); -} - -const defaultLogger: Logger = new Logger({ - level: LogLevel.Info, - logger: new ConsoleLogger(), - silent: true, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts deleted file mode 100644 index cfab23f9a834..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts deleted file mode 100644 index 56ebbb87c4d3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts +++ /dev/null @@ -1,134 +0,0 @@ -interface DenoGlobal { - version: { - deno: string; - }; -} - -interface BunGlobal { - version: string; -} - -declare const Deno: DenoGlobal | undefined; -declare const Bun: BunGlobal | undefined; -declare const EdgeRuntime: string | undefined; -declare const self: typeof globalThis.self & { - importScripts?: unknown; -}; - -/** - * A constant that indicates which environment and version the SDK is running in. - */ -export const RUNTIME: Runtime = evaluateRuntime(); - -export interface Runtime { - type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; - version?: string; - parsedVersion?: number; -} - -function evaluateRuntime(): Runtime { - /** - * A constant that indicates whether the environment the code is running is a Web Browser. - */ - const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; - if (isBrowser) { - return { - type: "browser", - version: window.navigator.userAgent, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Cloudflare. - * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent - */ - const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; - if (isCloudflare) { - return { - type: "workerd", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Edge Runtime. - * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime - */ - const isEdgeRuntime = typeof EdgeRuntime === "string"; - if (isEdgeRuntime) { - return { - type: "edge-runtime", - }; - } - - /** - * A constant that indicates whether the environment the code is running is a Web Worker. - */ - const isWebWorker = - typeof self === "object" && - typeof self?.importScripts === "function" && - (self.constructor?.name === "DedicatedWorkerGlobalScope" || - self.constructor?.name === "ServiceWorkerGlobalScope" || - self.constructor?.name === "SharedWorkerGlobalScope"); - if (isWebWorker) { - return { - type: "web-worker", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Deno. - * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions - */ - const isDeno = - typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; - if (isDeno) { - return { - type: "deno", - version: Deno.version.deno, - }; - } - - /** - * A constant that indicates whether the environment the code is running is Bun.sh. - */ - const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; - if (isBun) { - return { - type: "bun", - version: Bun.version, - }; - } - - /** - * A constant that indicates whether the environment the code is running is in React-Native. - * This check should come before Node.js detection since React Native may have a process polyfill. - * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js - */ - const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; - if (isReactNative) { - return { - type: "react-native", - }; - } - - /** - * A constant that indicates whether the environment the code is running is Node.JS. - */ - const isNode = - typeof process !== "undefined" && - "version" in process && - !!process.version && - "versions" in process && - !!process.versions?.node; - if (isNode) { - return { - type: "node", - version: process.versions.node, - parsedVersion: Number(process.versions.node.split(".")[0]), - }; - } - - return { - type: "unknown", - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts deleted file mode 100644 index 4cd8b1d95934..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { SchemaUtils } from "./builders/index.js"; - -export type Schema = BaseSchema & SchemaUtils; - -export type inferRaw = S extends Schema ? Raw : never; -export type inferParsed = S extends Schema ? Parsed : never; - -export interface BaseSchema { - parse: (raw: unknown, opts?: SchemaOptions) => MaybeValid; - json: (parsed: unknown, opts?: SchemaOptions) => MaybeValid; - getType: () => SchemaType | SchemaType; -} - -export const SchemaType = { - BIGINT: "bigint", - DATE: "date", - ENUM: "enum", - LIST: "list", - STRING_LITERAL: "stringLiteral", - BOOLEAN_LITERAL: "booleanLiteral", - OBJECT: "object", - ANY: "any", - BOOLEAN: "boolean", - NUMBER: "number", - STRING: "string", - UNKNOWN: "unknown", - NEVER: "never", - RECORD: "record", - SET: "set", - UNION: "union", - UNDISCRIMINATED_UNION: "undiscriminatedUnion", - NULLABLE: "nullable", - OPTIONAL: "optional", - OPTIONAL_NULLABLE: "optionalNullable", -} as const; - -export type SchemaType = (typeof SchemaType)[keyof typeof SchemaType]; - -export type MaybeValid = Valid | Invalid; - -export interface Valid { - ok: true; - value: T; -} - -export interface Invalid { - ok: false; - errors: ValidationError[]; -} - -export interface ValidationError { - path: string[]; - message: string; -} - -export interface SchemaOptions { - /** - * how to handle unrecognized keys in objects - * - * @default "fail" - */ - unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; - - /** - * whether to fail when an unrecognized discriminant value is - * encountered in a union - * - * @default false - */ - allowUnrecognizedUnionMembers?: boolean; - - /** - * whether to fail when an unrecognized enum value is encountered - * - * @default false - */ - allowUnrecognizedEnumValues?: boolean; - - /** - * whether to allow data that doesn't conform to the schema. - * invalid data is passed through without transformation. - * - * when this is enabled, .parse() and .json() will always - * return `ok: true`. `.parseOrThrow()` and `.jsonOrThrow()` - * will never fail. - * - * @default false - */ - skipValidation?: boolean; - - /** - * each validation failure contains a "path" property, which is - * the breadcrumbs to the offending node in the JSON. you can supply - * a prefix that is prepended to all the errors' paths. this can be - * helpful for zurg's internal debug logging. - */ - breadcrumbsPrefix?: string[]; - - /** - * whether to send 'null' for optional properties explicitly set to 'undefined'. - */ - omitUndefined?: boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts deleted file mode 100644 index 2c7c74c54a37..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export function bigint(): Schema { - const baseSchema: BaseSchema = { - parse: (raw, { breadcrumbsPrefix = [] } = {}) => { - if (typeof raw === "bigint") { - return { - ok: true, - value: raw, - }; - } - if (typeof raw === "number") { - return { - ok: true, - value: BigInt(raw), - }; - } - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(raw, "bigint | number"), - }, - ], - }; - }, - json: (bigint, { breadcrumbsPrefix = [] } = {}) => { - if (typeof bigint !== "bigint") { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(bigint, "bigint"), - }, - ], - }; - } - return { - ok: true, - value: bigint, - }; - }, - getType: () => SchemaType.BIGINT, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts deleted file mode 100644 index 13cc76e25b2a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { bigint } from "./bigint.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts deleted file mode 100644 index f02e3367f88f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -// https://stackoverflow.com/questions/12756159/regex-and-iso8601-formatted-datetime -const ISO_8601_REGEX = - /^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([.,]\d+(?!:))?)?(\17[0-5]\d([.,]\d+)?)?([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; - -export function date(): Schema { - const baseSchema: BaseSchema = { - parse: (raw, { breadcrumbsPrefix = [] } = {}) => { - if (typeof raw !== "string") { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(raw, "string"), - }, - ], - }; - } - if (!ISO_8601_REGEX.test(raw)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(raw, "ISO 8601 date string"), - }, - ], - }; - } - return { - ok: true, - value: new Date(raw), - }; - }, - json: (date, { breadcrumbsPrefix = [] } = {}) => { - if (date instanceof Date) { - return { - ok: true, - value: date.toISOString(), - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(date, "Date object"), - }, - ], - }; - } - }, - getType: () => SchemaType.DATE, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts deleted file mode 100644 index e22a2f16bfc9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { date } from "./date.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts deleted file mode 100644 index ccae24bcf200..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export function enum_(values: E): Schema { - const validValues = new Set(values); - - const schemaCreator = createIdentitySchemaCreator( - SchemaType.ENUM, - (value, { allowUnrecognizedEnumValues, breadcrumbsPrefix = [] } = {}) => { - if (typeof value !== "string") { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "string"), - }, - ], - }; - } - - if (!validValues.has(value) && !allowUnrecognizedEnumValues) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "enum"), - }, - ], - }; - } - - return { - ok: true, - value: value as U, - }; - }, - ); - - return schemaCreator(); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts deleted file mode 100644 index ff3bee3bf653..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { enum_ } from "./enum.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts deleted file mode 100644 index ddb9b3c94555..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export * from "./bigint/index.js"; -export * from "./date/index.js"; -export * from "./enum/index.js"; -export * from "./lazy/index.js"; -export * from "./list/index.js"; -export * from "./literals/index.js"; -export * from "./object/index.js"; -export * from "./object-like/index.js"; -export * from "./primitives/index.js"; -export * from "./record/index.js"; -export * from "./schema-utils/index.js"; -export * from "./set/index.js"; -export * from "./undiscriminated-union/index.js"; -export * from "./union/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts deleted file mode 100644 index e8ca40992061..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type { SchemaGetter } from "./lazy.js"; -export { lazy } from "./lazy.js"; -export { lazyObject } from "./lazyObject.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts deleted file mode 100644 index 37f28871683a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { BaseSchema, Schema } from "../../Schema.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export type SchemaGetter> = () => SchemaType; - -export function lazy(getter: SchemaGetter>): Schema { - const baseSchema = constructLazyBaseSchema(getter); - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function constructLazyBaseSchema( - getter: SchemaGetter>, -): BaseSchema { - return { - parse: (raw, opts) => getMemoizedSchema(getter).parse(raw, opts), - json: (parsed, opts) => getMemoizedSchema(getter).json(parsed, opts), - getType: () => getMemoizedSchema(getter).getType(), - }; -} - -type MemoizedGetter> = SchemaGetter & { __zurg_memoized?: SchemaType }; - -export function getMemoizedSchema>(getter: SchemaGetter): SchemaType { - const castedGetter = getter as MemoizedGetter; - if (castedGetter.__zurg_memoized == null) { - castedGetter.__zurg_memoized = getter(); - } - return castedGetter.__zurg_memoized; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts deleted file mode 100644 index 192c90e5c83e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { getObjectUtils } from "../object/index.js"; -import type { BaseObjectSchema, ObjectSchema } from "../object/types.js"; -import { getObjectLikeUtils } from "../object-like/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import { constructLazyBaseSchema, getMemoizedSchema, type SchemaGetter } from "./lazy.js"; - -export function lazyObject(getter: SchemaGetter>): ObjectSchema { - const baseSchema: BaseObjectSchema = { - ...constructLazyBaseSchema(getter), - _getRawProperties: () => getMemoizedSchema(getter)._getRawProperties(), - _getParsedProperties: () => getMemoizedSchema(getter)._getParsedProperties(), - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts deleted file mode 100644 index 021f1e4df1ff..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { list } from "./list.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts deleted file mode 100644 index 4f8c10ba483a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { type BaseSchema, type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export function list(schema: Schema): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => - validateAndTransformArray(raw, (item, index) => - schema.parse(item, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], - }), - ), - json: (parsed, opts) => - validateAndTransformArray(parsed, (item, index) => - schema.json(item, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], - }), - ), - getType: () => SchemaType.LIST, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} - -function validateAndTransformArray( - value: unknown, - transformItem: (item: Raw, index: number) => MaybeValid, -): MaybeValid { - if (!Array.isArray(value)) { - return { - ok: false, - errors: [ - { - message: getErrorMessageForIncorrectType(value, "list"), - path: [], - }, - ], - }; - } - - const maybeValidItems = value.map((item, index) => transformItem(item, index)); - - return maybeValidItems.reduce>( - (acc, item) => { - if (acc.ok && item.ok) { - return { - ok: true, - value: [...acc.value, item.value], - }; - } - - const errors: ValidationError[] = []; - if (!acc.ok) { - errors.push(...acc.errors); - } - if (!item.ok) { - errors.push(...item.errors); - } - - return { - ok: false, - errors, - }; - }, - { ok: true, value: [] }, - ); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts deleted file mode 100644 index db5d2c7a7313..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export function booleanLiteral(literal: V): Schema { - const schemaCreator = createIdentitySchemaCreator( - SchemaType.BOOLEAN_LITERAL, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (value === literal) { - return { - ok: true, - value: literal, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, `${literal.toString()}`), - }, - ], - }; - } - }, - ); - - return schemaCreator(); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts deleted file mode 100644 index 4a4ab39d91a7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { booleanLiteral } from "./booleanLiteral.js"; -export { stringLiteral } from "./stringLiteral.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts deleted file mode 100644 index ce6e20caf8d6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export function stringLiteral(literal: V): Schema { - const schemaCreator = createIdentitySchemaCreator( - SchemaType.STRING_LITERAL, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (value === literal) { - return { - ok: true, - value: literal, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, `"${literal}"`), - }, - ], - }; - } - }, - ); - - return schemaCreator(); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts deleted file mode 100644 index af69acb01dc1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { BaseSchema } from "../../Schema.js"; -import { filterObject } from "../../utils/filterObject.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; - -export function getObjectLikeUtils(schema: BaseSchema): ObjectLikeUtils { - return { - withParsedProperties: (properties) => withParsedProperties(schema, properties), - }; -} - -/** - * object-like utils are defined in one file to resolve issues with circular imports - */ - -export function withParsedProperties( - objectLike: BaseSchema, - properties: { [K in keyof Properties]: Properties[K] | ((parsed: ParsedObjectShape) => Properties[K]) }, -): ObjectLikeSchema { - const objectSchema: BaseSchema = { - parse: (raw, opts) => { - const parsedObject = objectLike.parse(raw, opts); - if (!parsedObject.ok) { - return parsedObject; - } - - const additionalProperties = Object.entries(properties).reduce>( - (processed, [key, value]) => { - return { - ...processed, - [key]: typeof value === "function" ? value(parsedObject.value) : value, - }; - }, - {}, - ); - - return { - ok: true, - value: { - ...parsedObject.value, - ...(additionalProperties as Properties), - }, - }; - }, - - json: (parsed, opts) => { - if (!isPlainObject(parsed)) { - return { - ok: false, - errors: [ - { - path: opts?.breadcrumbsPrefix ?? [], - message: getErrorMessageForIncorrectType(parsed, "object"), - }, - ], - }; - } - - // strip out added properties - const addedPropertyKeys = new Set(Object.keys(properties)); - const parsedWithoutAddedProperties = filterObject( - parsed, - Object.keys(parsed).filter((key) => !addedPropertyKeys.has(key)), - ); - - return objectLike.json(parsedWithoutAddedProperties as ParsedObjectShape, opts); - }, - - getType: () => objectLike.getType(), - }; - - return { - ...objectSchema, - ...getSchemaUtils(objectSchema), - ...getObjectLikeUtils(objectSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts deleted file mode 100644 index 2451ef7d0e50..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { getObjectLikeUtils, withParsedProperties } from "./getObjectLikeUtils.js"; -export type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts deleted file mode 100644 index 44b9669108cb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { BaseSchema, Schema } from "../../Schema.js"; - -export type ObjectLikeSchema = Schema & - BaseSchema & - ObjectLikeUtils; - -export interface ObjectLikeUtils { - withParsedProperties: >( - properties: { - [K in keyof T]: T[K] | ((parsed: Parsed) => T[K]); - }, - ) => ObjectLikeSchema; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts deleted file mode 100644 index c6611aaacd3b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -export { getObjectUtils, object } from "./object.js"; -export type { - inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas, - inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas, -} from "./objectWithoutOptionalProperties.js"; -export { objectWithoutOptionalProperties } from "./objectWithoutOptionalProperties.js"; -export type { Property } from "./property.js"; -export { isProperty, property } from "./property.js"; -export type { - BaseObjectSchema, - inferObjectSchemaFromPropertySchemas, - inferParsedObject, - inferParsedObjectFromPropertySchemas, - inferParsedPropertySchema, - inferRawKey, - inferRawObject, - inferRawObjectFromPropertySchemas, - inferRawPropertySchema, - ObjectSchema, - ObjectUtils, - PropertySchemas, -} from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts deleted file mode 100644 index 624d4d3888d5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts +++ /dev/null @@ -1,382 +0,0 @@ -import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; -import { entries } from "../../utils/entries.js"; -import { filterObject } from "../../utils/filterObject.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { keys } from "../../utils/keys.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { partition } from "../../utils/partition.js"; -import { getObjectLikeUtils } from "../object-like/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import { isProperty } from "./property.js"; -import type { - BaseObjectSchema, - inferObjectSchemaFromPropertySchemas, - inferParsedObjectFromPropertySchemas, - inferRawObjectFromPropertySchemas, - ObjectSchema, - ObjectUtils, - PropertySchemas, -} from "./types.js"; - -interface ObjectPropertyWithRawKey { - rawKey: string; - parsedKey: string; - valueSchema: Schema; -} - -export function object>( - schemas: T, -): inferObjectSchemaFromPropertySchemas { - const baseSchema: BaseObjectSchema< - inferRawObjectFromPropertySchemas, - inferParsedObjectFromPropertySchemas - > = { - _getRawProperties: () => - Object.entries(schemas).map(([parsedKey, propertySchema]) => - isProperty(propertySchema) ? propertySchema.rawKey : parsedKey, - ) as unknown as (keyof inferRawObjectFromPropertySchemas)[], - _getParsedProperties: () => keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[], - - parse: (raw, opts) => { - const rawKeyToProperty: Record = {}; - const requiredKeys: string[] = []; - - for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { - const rawKey = isProperty(schemaOrObjectProperty) ? schemaOrObjectProperty.rawKey : parsedKey; - const valueSchema: Schema = isProperty(schemaOrObjectProperty) - ? schemaOrObjectProperty.valueSchema - : schemaOrObjectProperty; - - const property: ObjectPropertyWithRawKey = { - rawKey, - parsedKey: parsedKey as string, - valueSchema, - }; - - rawKeyToProperty[rawKey] = property; - - if (isSchemaRequired(valueSchema)) { - requiredKeys.push(rawKey); - } - } - - return validateAndTransformObject({ - value: raw, - requiredKeys, - getProperty: (rawKey) => { - const property = rawKeyToProperty[rawKey]; - if (property == null) { - return undefined; - } - return { - transformedKey: property.parsedKey, - transform: (propertyValue) => - property.valueSchema.parse(propertyValue, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawKey], - }), - }; - }, - unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, - skipValidation: opts?.skipValidation, - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - omitUndefined: opts?.omitUndefined, - }); - }, - - json: (parsed, opts) => { - const requiredKeys: string[] = []; - - for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { - const valueSchema: Schema = isProperty(schemaOrObjectProperty) - ? schemaOrObjectProperty.valueSchema - : schemaOrObjectProperty; - - if (isSchemaRequired(valueSchema)) { - requiredKeys.push(parsedKey as string); - } - } - - return validateAndTransformObject({ - value: parsed, - requiredKeys, - getProperty: ( - parsedKey, - ): { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined => { - const property = schemas[parsedKey as keyof T]; - - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - if (property == null) { - return undefined; - } - - if (isProperty(property)) { - return { - transformedKey: property.rawKey, - transform: (propertyValue) => - property.valueSchema.json(propertyValue, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], - }), - }; - } else { - return { - transformedKey: parsedKey, - transform: (propertyValue) => - property.json(propertyValue, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], - }), - }; - } - }, - unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, - skipValidation: opts?.skipValidation, - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - omitUndefined: opts?.omitUndefined, - }); - }, - - getType: () => SchemaType.OBJECT, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; -} - -function validateAndTransformObject({ - value, - requiredKeys, - getProperty, - unrecognizedObjectKeys = "fail", - skipValidation = false, - breadcrumbsPrefix = [], -}: { - value: unknown; - requiredKeys: string[]; - getProperty: ( - preTransformedKey: string, - ) => { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined; - unrecognizedObjectKeys: "fail" | "passthrough" | "strip" | undefined; - skipValidation: boolean | undefined; - breadcrumbsPrefix: string[] | undefined; - omitUndefined: boolean | undefined; -}): MaybeValid { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - const missingRequiredKeys = new Set(requiredKeys); - const errors: ValidationError[] = []; - const transformed: Record = {}; - - for (const [preTransformedKey, preTransformedItemValue] of Object.entries(value)) { - const property = getProperty(preTransformedKey); - - if (property != null) { - missingRequiredKeys.delete(preTransformedKey); - - const value = property.transform(preTransformedItemValue as object); - if (value.ok) { - transformed[property.transformedKey] = value.value; - } else { - transformed[preTransformedKey] = preTransformedItemValue; - errors.push(...value.errors); - } - } else { - switch (unrecognizedObjectKeys) { - case "fail": - errors.push({ - path: [...breadcrumbsPrefix, preTransformedKey], - message: `Unexpected key "${preTransformedKey}"`, - }); - break; - case "strip": - break; - case "passthrough": - transformed[preTransformedKey] = preTransformedItemValue; - break; - } - } - } - - errors.push( - ...requiredKeys - .filter((key) => missingRequiredKeys.has(key)) - .map((key) => ({ - path: breadcrumbsPrefix, - message: `Missing required key "${key}"`, - })), - ); - - if (errors.length === 0 || skipValidation) { - return { - ok: true, - value: transformed as Transformed, - }; - } else { - return { - ok: false, - errors, - }; - } -} - -export function getObjectUtils(schema: BaseObjectSchema): ObjectUtils { - return { - extend: (extension: ObjectSchema) => { - const baseSchema: BaseObjectSchema = { - _getParsedProperties: () => [...schema._getParsedProperties(), ...extension._getParsedProperties()], - _getRawProperties: () => [...schema._getRawProperties(), ...extension._getRawProperties()], - parse: (raw, opts) => { - return validateAndTransformExtendedObject({ - extensionKeys: extension._getRawProperties(), - value: raw, - transformBase: (rawBase) => schema.parse(rawBase, opts), - transformExtension: (rawExtension) => extension.parse(rawExtension, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - json: (parsed, opts) => { - return validateAndTransformExtendedObject({ - extensionKeys: extension._getParsedProperties(), - value: parsed, - transformBase: (parsedBase) => schema.json(parsedBase, opts), - transformExtension: (parsedExtension) => extension.json(parsedExtension, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - getType: () => SchemaType.OBJECT, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; - }, - passthrough: () => { - const baseSchema: BaseObjectSchema = - { - _getParsedProperties: () => schema._getParsedProperties(), - _getRawProperties: () => schema._getRawProperties(), - parse: (raw, opts) => { - const transformed = schema.parse(raw, { ...opts, unrecognizedObjectKeys: "passthrough" }); - if (!transformed.ok) { - return transformed; - } - return { - ok: true, - value: { - ...(raw as any), - ...transformed.value, - }, - }; - }, - json: (parsed, opts) => { - const transformed = schema.json(parsed, { ...opts, unrecognizedObjectKeys: "passthrough" }); - if (!transformed.ok) { - return transformed; - } - return { - ok: true, - value: { - ...(parsed as any), - ...transformed.value, - }, - }; - }, - getType: () => SchemaType.OBJECT, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - ...getObjectUtils(baseSchema), - }; - }, - }; -} - -function validateAndTransformExtendedObject({ - extensionKeys, - value, - transformBase, - transformExtension, - breadcrumbsPrefix = [], -}: { - extensionKeys: (keyof PreTransformedExtension)[]; - value: unknown; - transformBase: (value: object) => MaybeValid; - transformExtension: (value: object) => MaybeValid; - breadcrumbsPrefix?: string[]; -}): MaybeValid { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - const extensionPropertiesSet = new Set(extensionKeys); - const [extensionProperties, baseProperties] = partition(keys(value), (key) => - extensionPropertiesSet.has(key as keyof PreTransformedExtension), - ); - - const transformedBase = transformBase(filterObject(value, baseProperties)); - const transformedExtension = transformExtension(filterObject(value, extensionProperties)); - - if (transformedBase.ok && transformedExtension.ok) { - return { - ok: true, - value: { - ...transformedBase.value, - ...transformedExtension.value, - }, - }; - } else { - return { - ok: false, - errors: [ - ...(transformedBase.ok ? [] : transformedBase.errors), - ...(transformedExtension.ok ? [] : transformedExtension.errors), - ], - }; - } -} - -function isSchemaRequired(schema: Schema): boolean { - return !isSchemaOptional(schema); -} - -function isSchemaOptional(schema: Schema): boolean { - switch (schema.getType()) { - case SchemaType.ANY: - case SchemaType.UNKNOWN: - case SchemaType.OPTIONAL: - case SchemaType.OPTIONAL_NULLABLE: - return true; - default: - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts deleted file mode 100644 index 4d39c862f0c4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { object } from "./object.js"; -import type { - inferParsedPropertySchema, - inferRawObjectFromPropertySchemas, - ObjectSchema, - PropertySchemas, -} from "./types.js"; - -export function objectWithoutOptionalProperties>( - schemas: T, -): inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas { - return object(schemas) as unknown as inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas; -} - -export type inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas> = - ObjectSchema< - inferRawObjectFromPropertySchemas, - inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas - >; - -export type inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas> = { - [K in keyof T]: inferParsedPropertySchema; -}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts deleted file mode 100644 index d1f9f386aa64..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Schema } from "../../Schema.js"; - -export function property( - rawKey: RawKey, - valueSchema: Schema, -): Property { - return { - rawKey, - valueSchema, - isProperty: true, - }; -} - -export interface Property { - rawKey: RawKey; - valueSchema: Schema; - isProperty: true; -} - -export function isProperty>(maybeProperty: unknown): maybeProperty is O { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return (maybeProperty as O).isProperty; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts deleted file mode 100644 index 735d14fc4cee..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts +++ /dev/null @@ -1,73 +0,0 @@ -import type { BaseSchema, inferParsed, inferRaw, Schema } from "../../Schema.js"; -import type { addQuestionMarksToNullableProperties } from "../../utils/addQuestionMarksToNullableProperties.js"; -import type { ObjectLikeUtils } from "../object-like/index.js"; -import type { SchemaUtils } from "../schema-utils/index.js"; -import type { Property } from "./property.js"; - -export type ObjectSchema = BaseObjectSchema & - ObjectLikeUtils & - ObjectUtils & - SchemaUtils; - -export interface BaseObjectSchema extends BaseSchema { - _getRawProperties: () => (keyof Raw)[]; - _getParsedProperties: () => (keyof Parsed)[]; -} - -export interface ObjectUtils { - extend: ( - schemas: ObjectSchema, - ) => ObjectSchema; - passthrough: () => ObjectSchema; -} - -export type inferRawObject> = O extends ObjectSchema ? Raw : never; - -export type inferParsedObject> = O extends ObjectSchema - ? Parsed - : never; - -export type inferObjectSchemaFromPropertySchemas> = ObjectSchema< - inferRawObjectFromPropertySchemas, - inferParsedObjectFromPropertySchemas ->; - -export type inferRawObjectFromPropertySchemas> = - addQuestionMarksToNullableProperties<{ - [ParsedKey in keyof T as inferRawKey]: inferRawPropertySchema; - }>; - -export type inferParsedObjectFromPropertySchemas> = - addQuestionMarksToNullableProperties<{ - [K in keyof T]: inferParsedPropertySchema; - }>; - -export type PropertySchemas = Record< - ParsedKeys, - Property | Schema ->; - -export type inferRawPropertySchema

| Schema> = P extends Property< - any, - infer Raw, - any -> - ? Raw - : P extends Schema - ? inferRaw

- : never; - -export type inferParsedPropertySchema

| Schema> = P extends Property< - any, - any, - infer Parsed -> - ? Parsed - : P extends Schema - ? inferParsed

- : never; - -export type inferRawKey< - ParsedKey extends string | number | symbol, - P extends Property | Schema, -> = P extends Property ? Raw : ParsedKey; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts deleted file mode 100644 index bc4d47fab56e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; - -export const any: () => Schema = createIdentitySchemaCreator(SchemaType.ANY, (value) => ({ - ok: true, - value, -})); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts deleted file mode 100644 index 78c3c36284c7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export const boolean: () => Schema = createIdentitySchemaCreator( - SchemaType.BOOLEAN, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (typeof value === "boolean") { - return { - ok: true, - value, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "boolean"), - }, - ], - }; - } - }, -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts deleted file mode 100644 index 7a3ee0154829..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { any } from "./any.js"; -export { boolean } from "./boolean.js"; -export { never } from "./never.js"; -export { number } from "./number.js"; -export { string } from "./string.js"; -export { unknown } from "./unknown.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts deleted file mode 100644 index 91f85d74c01b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; - -export const never: () => Schema = createIdentitySchemaCreator( - SchemaType.NEVER, - (_value, { breadcrumbsPrefix = [] } = {}) => ({ - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: "Expected never", - }, - ], - }), -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts deleted file mode 100644 index 6f16cd462a1b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export const number: () => Schema = createIdentitySchemaCreator( - SchemaType.NUMBER, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (typeof value === "number") { - return { - ok: true, - value, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "number"), - }, - ], - }; - } - }, -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts deleted file mode 100644 index b29d72ae7ef1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; - -export const string: () => Schema = createIdentitySchemaCreator( - SchemaType.STRING, - (value, { breadcrumbsPrefix = [] } = {}) => { - if (typeof value === "string") { - return { - ok: true, - value, - }; - } else { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "string"), - }, - ], - }; - } - }, -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts deleted file mode 100644 index 04514160366f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; - -export const unknown: () => Schema = createIdentitySchemaCreator( - SchemaType.UNKNOWN, - (value) => ({ ok: true, value }), -); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts deleted file mode 100644 index b17997f7bf84..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { record } from "./record.js"; -export type { BaseRecordSchema, RecordSchema } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts deleted file mode 100644 index a489660399b7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; -import { entries } from "../../utils/entries.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { BaseRecordSchema, RecordSchema } from "./types.js"; - -export function record( - keySchema: Schema, - valueSchema: Schema, -): RecordSchema { - const baseSchema: BaseRecordSchema = { - parse: (raw, opts) => { - return validateAndTransformRecord({ - value: raw, - isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, - transformKey: (key) => - keySchema.parse(key, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], - }), - transformValue: (value, key) => - valueSchema.parse(value, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], - }), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - json: (parsed, opts) => { - return validateAndTransformRecord({ - value: parsed, - isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, - transformKey: (key) => - keySchema.json(key, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], - }), - transformValue: (value, key) => - valueSchema.json(value, { - ...opts, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], - }), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - getType: () => SchemaType.RECORD, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} - -function validateAndTransformRecord({ - value, - isKeyNumeric, - transformKey, - transformValue, - breadcrumbsPrefix = [], -}: { - value: unknown; - isKeyNumeric: boolean; - transformKey: (key: string | number) => MaybeValid; - transformValue: (value: unknown, key: string | number) => MaybeValid; - breadcrumbsPrefix: string[] | undefined; -}): MaybeValid> { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - return entries(value).reduce>>( - (accPromise, [stringKey, value]) => { - if (value === undefined) { - return accPromise; - } - - const acc = accPromise; - - let key: string | number = stringKey; - if (isKeyNumeric) { - const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; - if (!Number.isNaN(numberKey)) { - key = numberKey; - } - } - const transformedKey = transformKey(key); - - const transformedValue = transformValue(value, key); - - if (acc.ok && transformedKey.ok && transformedValue.ok) { - return { - ok: true, - value: { - ...acc.value, - [transformedKey.value]: transformedValue.value, - }, - }; - } - - const errors: ValidationError[] = []; - if (!acc.ok) { - errors.push(...acc.errors); - } - if (!transformedKey.ok) { - errors.push(...transformedKey.errors); - } - if (!transformedValue.ok) { - errors.push(...transformedValue.errors); - } - - return { - ok: false, - errors, - }; - }, - { ok: true, value: {} as Record }, - ); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts deleted file mode 100644 index 5950b4cbde1e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { BaseSchema } from "../../Schema.js"; -import type { SchemaUtils } from "../schema-utils/index.js"; - -export type RecordSchema< - RawKey extends string | number, - RawValue, - ParsedKey extends string | number, - ParsedValue, -> = BaseRecordSchema & - SchemaUtils, Record>; - -export type BaseRecordSchema< - RawKey extends string | number, - RawValue, - ParsedKey extends string | number, - ParsedValue, -> = BaseSchema, Record>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts deleted file mode 100644 index daee3dc79184..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ValidationError } from "../../Schema.js"; -import { stringifyValidationError } from "./stringifyValidationErrors.js"; - -export class JsonError extends Error { - constructor(public readonly errors: ValidationError[]) { - super(errors.map(stringifyValidationError).join("; ")); - Object.setPrototypeOf(this, JsonError.prototype); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts deleted file mode 100644 index 9facf06159b2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ValidationError } from "../../Schema.js"; -import { stringifyValidationError } from "./stringifyValidationErrors.js"; - -export class ParseError extends Error { - constructor(public readonly errors: ValidationError[]) { - super(errors.map(stringifyValidationError).join("; ")); - Object.setPrototypeOf(this, ParseError.prototype); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts deleted file mode 100644 index 3ceaf4e011f0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { type BaseSchema, type Schema, type SchemaOptions, SchemaType } from "../../Schema.js"; -import { JsonError } from "./JsonError.js"; -import { ParseError } from "./ParseError.js"; - -export interface SchemaUtils { - nullable: () => Schema; - optional: () => Schema; - optionalNullable: () => Schema; - transform: (transformer: SchemaTransformer) => Schema; - parseOrThrow: (raw: unknown, opts?: SchemaOptions) => Parsed; - jsonOrThrow: (raw: unknown, opts?: SchemaOptions) => Raw; -} - -export interface SchemaTransformer { - transform: (parsed: Parsed) => Transformed; - untransform: (transformed: any) => Parsed; -} - -export function getSchemaUtils(schema: BaseSchema): SchemaUtils { - return { - nullable: () => nullable(schema), - optional: () => optional(schema), - optionalNullable: () => optionalNullable(schema), - transform: (transformer) => transform(schema, transformer), - parseOrThrow: (raw, opts) => { - const parsed = schema.parse(raw, opts); - if (parsed.ok) { - return parsed.value; - } - throw new ParseError(parsed.errors); - }, - jsonOrThrow: (parsed, opts) => { - const raw = schema.json(parsed, opts); - if (raw.ok) { - return raw.value; - } - throw new JsonError(raw.errors); - }, - }; -} - -/** - * schema utils are defined in one file to resolve issues with circular imports - */ - -export function nullable(schema: BaseSchema): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - if (raw == null) { - return { - ok: true, - value: null, - }; - } - return schema.parse(raw, opts); - }, - json: (parsed, opts) => { - if (parsed == null) { - return { - ok: true, - value: null, - }; - } - return schema.json(parsed, opts); - }, - getType: () => SchemaType.NULLABLE, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function optional( - schema: BaseSchema, -): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - if (raw == null) { - return { - ok: true, - value: undefined, - }; - } - return schema.parse(raw, opts); - }, - json: (parsed, opts) => { - if (opts?.omitUndefined && parsed === undefined) { - return { - ok: true, - value: undefined, - }; - } - if (parsed == null) { - return { - ok: true, - value: null, - }; - } - return schema.json(parsed, opts); - }, - getType: () => SchemaType.OPTIONAL, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function optionalNullable( - schema: BaseSchema, -): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - if (raw === undefined) { - return { - ok: true, - value: undefined, - }; - } - if (raw === null) { - return { - ok: true, - value: null, - }; - } - return schema.parse(raw, opts); - }, - json: (parsed, opts) => { - if (parsed === undefined) { - return { - ok: true, - value: undefined, - }; - } - if (parsed === null) { - return { - ok: true, - value: null, - }; - } - return schema.json(parsed, opts); - }, - getType: () => SchemaType.OPTIONAL_NULLABLE, - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} - -export function transform( - schema: BaseSchema, - transformer: SchemaTransformer, -): Schema { - const baseSchema: BaseSchema = { - parse: (raw, opts) => { - const parsed = schema.parse(raw, opts); - if (!parsed.ok) { - return parsed; - } - return { - ok: true, - value: transformer.transform(parsed.value), - }; - }, - json: (transformed, opts) => { - const parsed = transformer.untransform(transformed); - return schema.json(parsed, opts); - }, - getType: () => schema.getType(), - }; - - return { - ...baseSchema, - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts deleted file mode 100644 index efb3b0c46288..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type { SchemaUtils } from "./getSchemaUtils.js"; -export { getSchemaUtils, optional, transform } from "./getSchemaUtils.js"; -export { JsonError } from "./JsonError.js"; -export { ParseError } from "./ParseError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts deleted file mode 100644 index d36a4900c6e6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { ValidationError } from "../../Schema.js"; - -export function stringifyValidationError(error: ValidationError): string { - if (error.path.length === 0) { - return error.message; - } - return `${error.path.join(" -> ")}: ${error.message}`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts deleted file mode 100644 index c72be55e9406..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { set } from "./set.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts deleted file mode 100644 index 2013cdb4760f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { list } from "../list/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; - -export function set(schema: Schema): Schema> { - const listSchema = list(schema); - const baseSchema: BaseSchema> = { - parse: (raw, opts) => { - const parsedList = listSchema.parse(raw, opts); - if (parsedList.ok) { - return { - ok: true, - value: new Set(parsedList.value), - }; - } else { - return parsedList; - } - }, - json: (parsed, opts) => { - if (!(parsed instanceof Set)) { - return { - ok: false, - errors: [ - { - path: opts?.breadcrumbsPrefix ?? [], - message: getErrorMessageForIncorrectType(parsed, "Set"), - }, - ], - }; - } - const jsonList = listSchema.json([...parsed], opts); - return jsonList; - }, - getType: () => SchemaType.SET, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts deleted file mode 100644 index c8318222b4f7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type { - inferParsedUnidiscriminatedUnionSchema, - inferRawUnidiscriminatedUnionSchema, - UndiscriminatedUnionSchema, -} from "./types.js"; -export { undiscriminatedUnion } from "./undiscriminatedUnion.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts deleted file mode 100644 index 0d5096fab913..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { inferParsed, inferRaw, Schema } from "../../Schema.js"; - -export type UndiscriminatedUnionSchema = Schema< - inferRawUnidiscriminatedUnionSchema, - inferParsedUnidiscriminatedUnionSchema ->; - -export type inferRawUnidiscriminatedUnionSchema = inferRaw; - -export type inferParsedUnidiscriminatedUnionSchema = inferParsed; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts deleted file mode 100644 index 07591b4d3e63..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - type BaseSchema, - type MaybeValid, - type Schema, - type SchemaOptions, - SchemaType, - type ValidationError, -} from "../../Schema.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { inferParsedUnidiscriminatedUnionSchema, inferRawUnidiscriminatedUnionSchema } from "./types.js"; - -export function undiscriminatedUnion, ...Schema[]]>( - schemas: Schemas, -): Schema, inferParsedUnidiscriminatedUnionSchema> { - const baseSchema: BaseSchema< - inferRawUnidiscriminatedUnionSchema, - inferParsedUnidiscriminatedUnionSchema - > = { - parse: (raw, opts) => { - return validateAndTransformUndiscriminatedUnion>( - (schema, opts) => schema.parse(raw, opts), - schemas, - opts, - ); - }, - json: (parsed, opts) => { - return validateAndTransformUndiscriminatedUnion>( - (schema, opts) => schema.json(parsed, opts), - schemas, - opts, - ); - }, - getType: () => SchemaType.UNDISCRIMINATED_UNION, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; -} - -function validateAndTransformUndiscriminatedUnion( - transform: (schema: Schema, opts: SchemaOptions) => MaybeValid, - schemas: Schema[], - opts: SchemaOptions | undefined, -): MaybeValid { - const errors: ValidationError[] = []; - for (const [index, schema] of schemas.entries()) { - const transformed = transform(schema, { ...opts, skipValidation: false }); - if (transformed.ok) { - return transformed; - } else { - for (const error of transformed.errors) { - errors.push({ - path: error.path, - message: `[Variant ${index}] ${error.message}`, - }); - } - } - } - - return { - ok: false, - errors, - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts deleted file mode 100644 index 73cd62adeba5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts +++ /dev/null @@ -1,14 +0,0 @@ -export function discriminant( - parsedDiscriminant: ParsedDiscriminant, - rawDiscriminant: RawDiscriminant, -): Discriminant { - return { - parsedDiscriminant, - rawDiscriminant, - }; -} - -export interface Discriminant { - parsedDiscriminant: ParsedDiscriminant; - rawDiscriminant: RawDiscriminant; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts deleted file mode 100644 index 6bc29ba9ed38..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type { Discriminant } from "./discriminant.js"; -export { discriminant } from "./discriminant.js"; -export type { - inferParsedDiscriminant, - inferParsedUnion, - inferRawDiscriminant, - inferRawUnion, - UnionSubtypes, -} from "./types.js"; -export { union } from "./union.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts deleted file mode 100644 index 7bfdd636d8d0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { inferParsedObject, inferRawObject, ObjectSchema } from "../object/index.js"; -import type { Discriminant } from "./discriminant.js"; - -export type UnionSubtypes = { - [K in DiscriminantValues]: ObjectSchema; -}; - -export type inferRawUnion, U extends UnionSubtypes> = { - [K in keyof U]: Record, K> & inferRawObject; -}[keyof U]; - -export type inferParsedUnion, U extends UnionSubtypes> = { - [K in keyof U]: Record, K> & inferParsedObject; -}[keyof U]; - -export type inferRawDiscriminant> = D extends string - ? D - : D extends Discriminant - ? Raw - : never; - -export type inferParsedDiscriminant> = D extends string - ? D - : D extends Discriminant - ? Parsed - : never; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts deleted file mode 100644 index 509658e0eb3d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { type BaseSchema, type MaybeValid, SchemaType } from "../../Schema.js"; -import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; -import { isPlainObject } from "../../utils/isPlainObject.js"; -import { keys } from "../../utils/keys.js"; -import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; -import { enum_ } from "../enum/index.js"; -import type { ObjectSchema } from "../object/index.js"; -import { getObjectLikeUtils, type ObjectLikeSchema } from "../object-like/index.js"; -import { getSchemaUtils } from "../schema-utils/index.js"; -import type { Discriminant } from "./discriminant.js"; -import type { - inferParsedDiscriminant, - inferParsedUnion, - inferRawDiscriminant, - inferRawUnion, - UnionSubtypes, -} from "./types.js"; - -export function union, U extends UnionSubtypes>( - discriminant: D, - union: U, -): ObjectLikeSchema, inferParsedUnion> { - const rawDiscriminant = - typeof discriminant === "string" ? discriminant : (discriminant.rawDiscriminant as inferRawDiscriminant); - const parsedDiscriminant = - typeof discriminant === "string" - ? discriminant - : (discriminant.parsedDiscriminant as inferParsedDiscriminant); - - const discriminantValueSchema = enum_(keys(union) as string[]); - - const baseSchema: BaseSchema, inferParsedUnion> = { - parse: (raw, opts) => { - return transformAndValidateUnion({ - value: raw, - discriminant: rawDiscriminant, - transformedDiscriminant: parsedDiscriminant, - transformDiscriminantValue: (discriminantValue) => - discriminantValueSchema.parse(discriminantValue, { - allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawDiscriminant], - }), - getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], - allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, - transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => - additionalPropertiesSchema.parse(additionalProperties, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - json: (parsed, opts) => { - return transformAndValidateUnion({ - value: parsed, - discriminant: parsedDiscriminant, - transformedDiscriminant: rawDiscriminant, - transformDiscriminantValue: (discriminantValue) => - discriminantValueSchema.json(discriminantValue, { - allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, - breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedDiscriminant], - }), - getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], - allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, - transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => - additionalPropertiesSchema.json(additionalProperties, opts), - breadcrumbsPrefix: opts?.breadcrumbsPrefix, - }); - }, - getType: () => SchemaType.UNION, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - ...getObjectLikeUtils(baseSchema), - }; -} - -function transformAndValidateUnion< - TransformedDiscriminant extends string, - TransformedDiscriminantValue extends string, - TransformedAdditionalProperties, ->({ - value, - discriminant, - transformedDiscriminant, - transformDiscriminantValue, - getAdditionalPropertiesSchema, - allowUnrecognizedUnionMembers = false, - transformAdditionalProperties, - breadcrumbsPrefix = [], -}: { - value: unknown; - discriminant: string; - transformedDiscriminant: TransformedDiscriminant; - transformDiscriminantValue: (discriminantValue: unknown) => MaybeValid; - getAdditionalPropertiesSchema: (discriminantValue: string) => ObjectSchema | undefined; - allowUnrecognizedUnionMembers: boolean | undefined; - transformAdditionalProperties: ( - additionalProperties: unknown, - additionalPropertiesSchema: ObjectSchema, - ) => MaybeValid; - breadcrumbsPrefix: string[] | undefined; -}): MaybeValid & TransformedAdditionalProperties> { - if (!isPlainObject(value)) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: getErrorMessageForIncorrectType(value, "object"), - }, - ], - }; - } - - const { [discriminant]: discriminantValue, ...additionalProperties } = value; - - if (discriminantValue == null) { - return { - ok: false, - errors: [ - { - path: breadcrumbsPrefix, - message: `Missing discriminant ("${discriminant}")`, - }, - ], - }; - } - - const transformedDiscriminantValue = transformDiscriminantValue(discriminantValue); - if (!transformedDiscriminantValue.ok) { - return { - ok: false, - errors: transformedDiscriminantValue.errors, - }; - } - - const additionalPropertiesSchema = getAdditionalPropertiesSchema(transformedDiscriminantValue.value); - - if (additionalPropertiesSchema == null) { - if (allowUnrecognizedUnionMembers) { - return { - ok: true, - value: { - [transformedDiscriminant]: transformedDiscriminantValue.value, - ...additionalProperties, - } as Record & TransformedAdditionalProperties, - }; - } else { - return { - ok: false, - errors: [ - { - path: [...breadcrumbsPrefix, discriminant], - message: "Unexpected discriminant value", - }, - ], - }; - } - } - - const transformedAdditionalProperties = transformAdditionalProperties( - additionalProperties, - additionalPropertiesSchema, - ); - if (!transformedAdditionalProperties.ok) { - return transformedAdditionalProperties; - } - - return { - ok: true, - value: { - [transformedDiscriminant]: discriminantValue, - ...transformedAdditionalProperties.value, - } as Record & TransformedAdditionalProperties, - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts deleted file mode 100644 index befac2e3bebc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./builders/index.js"; -export type { inferParsed, inferRaw, Schema, SchemaOptions } from "./Schema.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts deleted file mode 100644 index 9cd354b3418e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts +++ /dev/null @@ -1 +0,0 @@ -export type MaybePromise = T | Promise; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts deleted file mode 100644 index 59f9e658867b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type addQuestionMarksToNullableProperties = { - [K in OptionalKeys]?: T[K]; -} & Pick>; - -export type OptionalKeys = { - [K in keyof T]-?: undefined extends T[K] ? K : never; -}[keyof T]; - -export type RequiredKeys = Exclude>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts deleted file mode 100644 index 9aa4ed5029a0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { getSchemaUtils } from "../builders/schema-utils/index.js"; -import type { BaseSchema, MaybeValid, Schema, SchemaOptions, SchemaType } from "../Schema.js"; -import { maybeSkipValidation } from "./maybeSkipValidation.js"; - -export function createIdentitySchemaCreator( - schemaType: SchemaType, - validate: (value: unknown, opts?: SchemaOptions) => MaybeValid, -): () => Schema { - return () => { - const baseSchema: BaseSchema = { - parse: validate, - json: validate, - getType: () => schemaType, - }; - - return { - ...maybeSkipValidation(baseSchema), - ...getSchemaUtils(baseSchema), - }; - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts deleted file mode 100644 index 2d5c93d657ce..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function entries(object: T): [keyof T, T[keyof T]][] { - return Object.entries(object) as [keyof T, T[keyof T]][]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts deleted file mode 100644 index 70527d10013b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts +++ /dev/null @@ -1,13 +0,0 @@ -export function filterObject(obj: T, keysToInclude: K[]): Pick { - const keysToIncludeSet = new Set(keysToInclude); - return Object.entries(obj).reduce( - (acc, [key, value]) => { - if (keysToIncludeSet.has(key as K)) { - acc[key as K] = value as T[K]; - } - return acc; - // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter - }, - {} as Pick, - ); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts deleted file mode 100644 index 1a5c31027ce9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts +++ /dev/null @@ -1,25 +0,0 @@ -export function getErrorMessageForIncorrectType(value: unknown, expectedType: string): string { - return `Expected ${expectedType}. Received ${getTypeAsString(value)}.`; -} - -function getTypeAsString(value: unknown): string { - if (Array.isArray(value)) { - return "list"; - } - if (value === null) { - return "null"; - } - if (value instanceof BigInt) { - return "BigInt"; - } - switch (typeof value) { - case "string": - return `"${value}"`; - case "bigint": - case "number": - case "boolean": - case "undefined": - return `${value}`; - } - return typeof value; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts deleted file mode 100644 index db82a722c35b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts +++ /dev/null @@ -1,17 +0,0 @@ -// borrowed from https://github.com/lodash/lodash/blob/master/isPlainObject.js -export function isPlainObject(value: unknown): value is Record { - if (typeof value !== "object" || value === null) { - return false; - } - - if (Object.getPrototypeOf(value) === null) { - return true; - } - - let proto = value; - while (Object.getPrototypeOf(proto) !== null) { - proto = Object.getPrototypeOf(proto); - } - - return Object.getPrototypeOf(value) === proto; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts deleted file mode 100644 index 2e0930e2d70b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function keys(object: T): (keyof T)[] { - return Object.keys(object) as (keyof T)[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts deleted file mode 100644 index f32d4525136d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { BaseSchema, MaybeValid, SchemaOptions } from "../Schema.js"; - -export function maybeSkipValidation, Raw, Parsed>(schema: S): S { - return { - ...schema, - json: transformAndMaybeSkipValidation(schema.json), - parse: transformAndMaybeSkipValidation(schema.parse), - }; -} - -function transformAndMaybeSkipValidation( - transform: (value: unknown, opts?: SchemaOptions) => MaybeValid, -): (value: unknown, opts?: SchemaOptions) => MaybeValid { - return (value, opts): MaybeValid => { - const transformed = transform(value, opts); - const { skipValidation = false } = opts ?? {}; - if (!transformed.ok && skipValidation) { - // biome-ignore lint/suspicious/noConsole: allow console - console.warn( - [ - "Failed to validate.", - ...transformed.errors.map( - (error) => - " - " + - (error.path.length > 0 ? `${error.path.join(".")}: ${error.message}` : error.message), - ), - ].join("\n"), - ); - - return { - ok: true, - value: value as T, - }; - } else { - return transformed; - } - }; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts deleted file mode 100644 index f58d6f3d35f3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts +++ /dev/null @@ -1,12 +0,0 @@ -export function partition(items: readonly T[], predicate: (item: T) => boolean): [T[], T[]] { - const trueItems: T[] = [], - falseItems: T[] = []; - for (const item of items) { - if (predicate(item)) { - trueItems.push(item); - } else { - falseItems.push(item); - } - } - return [trueItems, falseItems]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts deleted file mode 100644 index 19b901244218..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function encodePathParam(param: unknown): string { - if (param === null) { - return "null"; - } - const typeofParam = typeof param; - switch (typeofParam) { - case "undefined": - return "undefined"; - case "string": - case "number": - case "boolean": - break; - default: - param = String(param); - break; - } - return encodeURIComponent(param as string | number | boolean); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts deleted file mode 100644 index f2e0fa2d2221..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { encodePathParam } from "./encodePathParam.js"; -export { join } from "./join.js"; -export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts deleted file mode 100644 index 7ca7daef094d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts +++ /dev/null @@ -1,79 +0,0 @@ -export function join(base: string, ...segments: string[]): string { - if (!base) { - return ""; - } - - if (segments.length === 0) { - return base; - } - - if (base.includes("://")) { - let url: URL; - try { - url = new URL(base); - } catch { - return joinPath(base, ...segments); - } - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - url.pathname = joinPathSegments(url.pathname, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { - url.pathname += "/"; - } - - return url.toString(); - } - - return joinPath(base, ...segments); -} - -function joinPath(base: string, ...segments: string[]): string { - if (segments.length === 0) { - return base; - } - - let result = base; - - const lastSegment = segments[segments.length - 1]; - const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); - - for (const segment of segments) { - const cleanSegment = trimSlashes(segment); - if (cleanSegment) { - result = joinPathSegments(result, cleanSegment); - } - } - - if (shouldPreserveTrailingSlash && !result.endsWith("/")) { - result += "/"; - } - - return result; -} - -function joinPathSegments(left: string, right: string): string { - if (left.endsWith("/")) { - return left + right; - } - return `${left}/${right}`; -} - -function trimSlashes(str: string): string { - if (!str) return str; - - let start = 0; - let end = str.length; - - if (str.startsWith("/")) start = 1; - if (str.endsWith("/")) end = str.length - 1; - - return start === 0 && end === str.length ? str : str.slice(start, end); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts deleted file mode 100644 index 13e89be9d9a6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts +++ /dev/null @@ -1,74 +0,0 @@ -interface QueryStringOptions { - arrayFormat?: "indices" | "repeat"; - encode?: boolean; -} - -const defaultQsOptions: Required = { - arrayFormat: "indices", - encode: true, -} as const; - -function encodeValue(value: unknown, shouldEncode: boolean): string { - if (value === undefined) { - return ""; - } - if (value === null) { - return ""; - } - const stringValue = String(value); - return shouldEncode ? encodeURIComponent(stringValue) : stringValue; -} - -function stringifyObject(obj: Record, prefix = "", options: Required): string[] { - const parts: string[] = []; - - for (const [key, value] of Object.entries(obj)) { - const fullKey = prefix ? `${prefix}[${key}]` : key; - - if (value === undefined) { - continue; - } - - if (Array.isArray(value)) { - if (value.length === 0) { - continue; - } - for (let i = 0; i < value.length; i++) { - const item = value[i]; - if (item === undefined) { - continue; - } - if (typeof item === "object" && !Array.isArray(item) && item !== null) { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - parts.push(...stringifyObject(item as Record, arrayKey, options)); - } else { - const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; - const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; - parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); - } - } - } else if (typeof value === "object" && value !== null) { - if (Object.keys(value as Record).length === 0) { - continue; - } - parts.push(...stringifyObject(value as Record, fullKey, options)); - } else { - const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; - parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); - } - } - - return parts; -} - -export function toQueryString(obj: unknown, options?: QueryStringOptions): string { - if (obj == null || typeof obj !== "object") { - return ""; - } - - const parts = stringifyObject(obj as Record, "", { - ...defaultQsOptions, - ...options, - }); - return parts.join("&"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts deleted file mode 100644 index d2e515f5d4e2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import { toJson } from "../core/json.js"; - -export class SeedExhaustiveError extends Error { - public readonly statusCode?: number; - public readonly body?: unknown; - public readonly rawResponse?: core.RawResponse; - - constructor({ - message, - statusCode, - body, - rawResponse, - }: { - message?: string; - statusCode?: number; - body?: unknown; - rawResponse?: core.RawResponse; - }) { - super(buildMessage({ message, statusCode, body })); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - this.statusCode = statusCode; - this.body = body; - this.rawResponse = rawResponse; - } -} - -function buildMessage({ - message, - statusCode, - body, -}: { - message: string | undefined; - statusCode: number | undefined; - body: unknown | undefined; -}): string { - const lines: string[] = []; - if (message != null) { - lines.push(message); - } - - if (statusCode != null) { - lines.push(`Status code: ${statusCode.toString()}`); - } - - if (body != null) { - lines.push(`Body: ${toJson(body, undefined, 2)}`); - } - - return lines.join("\n"); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts deleted file mode 100644 index 82a3cb8de266..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -export class SeedExhaustiveTimeoutError extends Error { - constructor(message: string) { - super(message); - Object.setPrototypeOf(this, new.target.prototype); - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = this.constructor.name; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts deleted file mode 100644 index deb55c602654..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as core from "../core/index.js"; -import * as errors from "./index.js"; - -export function handleNonStatusCodeError( - error: core.Fetcher.Error, - rawResponse: core.RawResponse, - method: string, - path: string, -): never { - switch (error.reason) { - case "non-json": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - body: error.rawBody, - rawResponse: rawResponse, - }); - case "body-is-null": - throw new errors.SeedExhaustiveError({ - statusCode: error.statusCode, - rawResponse: rawResponse, - }); - case "timeout": - throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); - case "unknown": - throw new errors.SeedExhaustiveError({ - message: error.errorMessage, - rawResponse: rawResponse, - }); - default: - throw new errors.SeedExhaustiveError({ - message: "Unknown error", - rawResponse: rawResponse, - }); - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts deleted file mode 100644 index 2e2853073a94..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; -export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts deleted file mode 100644 index 7b70ee14fc02..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts deleted file mode 100644 index 9f0bdd34e0d5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * as SeedExhaustive from "./api/index.js"; -export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; -export { SeedExhaustiveClient } from "./Client.js"; -export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; -export * from "./exports.js"; -export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts deleted file mode 100644 index e37f244ea60c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts deleted file mode 100644 index 668b72ec3402..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, - string[] -> = core.serialization.list(core.serialization.string()); - -export declare namespace Request { - export type Raw = string[]; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, - string[] -> = core.serialization.list(core.serialization.string()); - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts deleted file mode 100644 index 242978c11a34..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, - Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); - -export declare namespace Request { - export type Raw = Record; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, - Record -> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts deleted file mode 100644 index 9003c1ac3676..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, - Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); - -export declare namespace Request { - export type Raw = Record; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, - Record -> = core.serialization.record(core.serialization.string(), core.serialization.string()); - -export declare namespace Response { - export type Raw = Record; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts deleted file mode 100644 index b7e20374f571..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import type * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.container.getAndReturnOptional.Request.Raw, - SeedExhaustive.types.ObjectWithRequiredField | undefined -> = ObjectWithRequiredField.optional(); - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.container.getAndReturnOptional.Response.Raw, - SeedExhaustive.types.ObjectWithRequiredField | undefined -> = ObjectWithRequiredField.optional(); - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts deleted file mode 100644 index 4792425484f1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); - -export declare namespace Request { - export type Raw = ObjectWithRequiredField.Raw[]; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, - SeedExhaustive.types.ObjectWithRequiredField[] -> = core.serialization.list(ObjectWithRequiredField); - -export declare namespace Response { - export type Raw = ObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts deleted file mode 100644 index 53931f5e393e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, - Set -> = core.serialization.set(core.serialization.string()); - -export declare namespace Request { - export type Raw = string[]; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, - Set -> = core.serialization.set(core.serialization.string()); - -export declare namespace Response { - export type Raw = string[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts deleted file mode 100644 index 1972f5b270f4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; -export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; -export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; -export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; -export * as getAndReturnOptional from "./getAndReturnOptional.js"; -export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; -export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts deleted file mode 100644 index e053119b972c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * as testDelete from "./testDelete.js"; -export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts deleted file mode 100644 index b6273278aa1f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.boolean(); - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts deleted file mode 100644 index a642aa120d8b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts deleted file mode 100644 index cd7e640937da..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as container from "./container/index.js"; -export * as httpMethods from "./httpMethods/index.js"; -export * as object from "./object/index.js"; -export * as params from "./params/index.js"; -export * as primitive from "./primitive/index.js"; -export * as put from "./put/index.js"; -export * from "./put/types/index.js"; -export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts deleted file mode 100644 index 60f40db3f33b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts +++ /dev/null @@ -1,15 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, - SeedExhaustive.types.NestedObjectWithRequiredField[] -> = core.serialization.list(NestedObjectWithRequiredField); - -export declare namespace Request { - export type Raw = NestedObjectWithRequiredField.Raw[]; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts deleted file mode 100644 index d00c4c582910..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts deleted file mode 100644 index c82dda746e5a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts deleted file mode 100644 index da8888318c5b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts deleted file mode 100644 index b30603cae602..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as getWithInlinePath from "./getWithInlinePath.js"; -export * as getWithPath from "./getWithPath.js"; -export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; -export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts deleted file mode 100644 index b84b3f790f22..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.params.modifyWithInlinePath.Response.Raw, - string -> = core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts deleted file mode 100644 index 8369d9dae207..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts deleted file mode 100644 index eb7fdb1065fb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, - string -> = core.serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, - string -> = core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts deleted file mode 100644 index f51fb5f9e891..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.boolean(); - -export declare namespace Request { - export type Raw = boolean; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnBool.Response.Raw, - boolean -> = core.serialization.boolean(); - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts deleted file mode 100644 index 08ac416d1caf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDate.Response.Raw, - string -> = core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts deleted file mode 100644 index a80c46b7f418..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, - Date -> = core.serialization.date(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, - Date -> = core.serialization.date(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts deleted file mode 100644 index bba9c504ff71..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, - number -> = core.serialization.number(); - -export declare namespace Request { - export type Raw = number; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, - number -> = core.serialization.number(); - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts deleted file mode 100644 index 552fe3843ef9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.number(); - -export declare namespace Request { - export type Raw = number; -} - -export const Response: core.serialization.Schema = - core.serialization.number(); - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts deleted file mode 100644 index 191eda735e47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.number(); - -export declare namespace Request { - export type Raw = number; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnLong.Response.Raw, - number -> = core.serialization.number(); - -export declare namespace Response { - export type Raw = number; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts deleted file mode 100644 index f75bf59ba909..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts +++ /dev/null @@ -1,22 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Request.Raw, - string -> = core.serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnString.Response.Raw, - string -> = core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts deleted file mode 100644 index 64875010a017..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts +++ /dev/null @@ -1,20 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Request { - export type Raw = string; -} - -export const Response: core.serialization.Schema< - serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, - string -> = core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts deleted file mode 100644 index 9805ab86b129..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as getAndReturnBase64 from "./getAndReturnBase64.js"; -export * as getAndReturnBool from "./getAndReturnBool.js"; -export * as getAndReturnDate from "./getAndReturnDate.js"; -export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; -export * as getAndReturnDouble from "./getAndReturnDouble.js"; -export * as getAndReturnInt from "./getAndReturnInt.js"; -export * as getAndReturnLong from "./getAndReturnLong.js"; -export * as getAndReturnString from "./getAndReturnString.js"; -export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts deleted file mode 100644 index 47e249372cff..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ErrorCategory: core.serialization.Schema< - serializers.endpoints.ErrorCategory.Raw, - SeedExhaustive.endpoints.ErrorCategory -> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); - -export declare namespace ErrorCategory { - export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts deleted file mode 100644 index a36b10d4b362..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts +++ /dev/null @@ -1,37 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ErrorCode: core.serialization.Schema< - serializers.endpoints.ErrorCode.Raw, - SeedExhaustive.endpoints.ErrorCode -> = core.serialization.enum_([ - "INTERNAL_SERVER_ERROR", - "UNAUTHORIZED", - "FORBIDDEN", - "BAD_REQUEST", - "CONFLICT", - "GONE", - "UNPROCESSABLE_ENTITY", - "NOT_IMPLEMENTED", - "BAD_GATEWAY", - "SERVICE_UNAVAILABLE", - "Unknown", -]); - -export declare namespace ErrorCode { - export type Raw = - | "INTERNAL_SERVER_ERROR" - | "UNAUTHORIZED" - | "FORBIDDEN" - | "BAD_REQUEST" - | "CONFLICT" - | "GONE" - | "UNPROCESSABLE_ENTITY" - | "NOT_IMPLEMENTED" - | "BAD_GATEWAY" - | "SERVICE_UNAVAILABLE" - | "Unknown"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts deleted file mode 100644 index 59ab664d43a2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts +++ /dev/null @@ -1,26 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ErrorCategory } from "./ErrorCategory.js"; -import { ErrorCode } from "./ErrorCode.js"; - -export const Error_: core.serialization.ObjectSchema< - serializers.endpoints.Error_.Raw, - SeedExhaustive.endpoints.Error_ -> = core.serialization.object({ - category: ErrorCategory, - code: ErrorCode, - detail: core.serialization.string().optional(), - field: core.serialization.string().optional(), -}); - -export declare namespace Error_ { - export interface Raw { - category: ErrorCategory.Raw; - code: ErrorCode.Raw; - detail?: string | null; - field?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts deleted file mode 100644 index 17af0986c151..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Error_ } from "./Error_.js"; - -export const PutResponse: core.serialization.ObjectSchema< - serializers.endpoints.PutResponse.Raw, - SeedExhaustive.endpoints.PutResponse -> = core.serialization.object({ - errors: core.serialization.list(Error_).optional(), -}); - -export declare namespace PutResponse { - export interface Raw { - errors?: Error_.Raw[] | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts deleted file mode 100644 index 3293f66bb34c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from "./Error_.js"; -export * from "./ErrorCategory.js"; -export * from "./ErrorCode.js"; -export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts deleted file mode 100644 index 66e101cdc2d7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as noEndingSlash from "./noEndingSlash.js"; -export * as withEndingSlash from "./withEndingSlash.js"; -export * as withMixedCase from "./withMixedCase.js"; -export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts deleted file mode 100644 index 2b0a2cfbfa53..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts deleted file mode 100644 index de39ec7a2a0d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts deleted file mode 100644 index ffedf860047a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts deleted file mode 100644 index 8d308fd3e42f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts deleted file mode 100644 index 5d81697cccfb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../api/index.js"; -import * as core from "../../../../core/index.js"; -import type * as serializers from "../../../index.js"; - -export const BadObjectRequestInfo: core.serialization.ObjectSchema< - serializers.BadObjectRequestInfo.Raw, - SeedExhaustive.BadObjectRequestInfo -> = core.serialization.object({ - message: core.serialization.string(), -}); - -export declare namespace BadObjectRequestInfo { - export interface Raw { - message: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts deleted file mode 100644 index b10afa3b7749..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts deleted file mode 100644 index 20b614a89e2f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export * as endpoints from "./endpoints/index.js"; -export * as generalErrors from "./generalErrors/index.js"; -export * from "./generalErrors/types/index.js"; -export * from "./inlinedRequests/client/requests/index.js"; -export * as inlinedRequests from "./inlinedRequests/index.js"; -export * as noAuth from "./noAuth/index.js"; -export * as noReqBody from "./noReqBody/index.js"; -export * as reqWithHeaders from "./reqWithHeaders/index.js"; -export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts deleted file mode 100644 index 195f9aa8a846..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts deleted file mode 100644 index d8c20c33277a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts +++ /dev/null @@ -1,23 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../api/index.js"; -import * as core from "../../../../../core/index.js"; -import type * as serializers from "../../../../index.js"; -import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; - -export const PostWithObjectBody: core.serialization.Schema< - serializers.PostWithObjectBody.Raw, - SeedExhaustive.PostWithObjectBody -> = core.serialization.object({ - string: core.serialization.string(), - integer: core.serialization.number(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), -}); - -export declare namespace PostWithObjectBody { - export interface Raw { - string: string; - integer: number; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts deleted file mode 100644 index d62a81ce61fd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts deleted file mode 100644 index 549edcdba7f2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts deleted file mode 100644 index 8e7617816edf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../core/index.js"; -import type * as serializers from "../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.boolean(); - -export declare namespace Response { - export type Raw = boolean; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts deleted file mode 100644 index b62616349ec6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts deleted file mode 100644 index c0cba3668202..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../core/index.js"; -import type * as serializers from "../../../index.js"; - -export const Response: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Response { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts deleted file mode 100644 index 70ac5077c6f2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts +++ /dev/null @@ -1,11 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as core from "../../../../core/index.js"; -import type * as serializers from "../../../index.js"; - -export const Request: core.serialization.Schema = - core.serialization.string(); - -export declare namespace Request { - export type Raw = string; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts deleted file mode 100644 index fb7f25afb170..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts deleted file mode 100644 index 914b8c3c7214..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts deleted file mode 100644 index e445af0d831e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts deleted file mode 100644 index ab35ed9023bd..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithDocs: core.serialization.ObjectSchema< - serializers.types.ObjectWithDocs.Raw, - SeedExhaustive.types.ObjectWithDocs -> = core.serialization.object({ - string: core.serialization.string(), -}); - -export declare namespace ObjectWithDocs { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts deleted file mode 100644 index 3eedfcba912c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts deleted file mode 100644 index 96a37eda2a46..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const WeatherReport: core.serialization.Schema< - serializers.types.WeatherReport.Raw, - SeedExhaustive.types.WeatherReport -> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); - -export declare namespace WeatherReport { - export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts deleted file mode 100644 index 3b2d63911a15..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts deleted file mode 100644 index 52175f3cee16..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * as docs from "./docs/index.js"; -export * from "./docs/types/index.js"; -export * as enum_ from "./enum/index.js"; -export * from "./enum/types/index.js"; -export * as object from "./object/index.js"; -export * from "./object/types/index.js"; -export * as union from "./union/index.js"; -export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts deleted file mode 100644 index e8e0fd387243..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts +++ /dev/null @@ -1,19 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { OptionalAlias } from "./OptionalAlias.js"; - -export const DoubleOptional: core.serialization.ObjectSchema< - serializers.types.DoubleOptional.Raw, - SeedExhaustive.types.DoubleOptional -> = core.serialization.object({ - optionalAlias: OptionalAlias.optional(), -}); - -export declare namespace DoubleOptional { - export interface Raw { - optionalAlias?: (OptionalAlias.Raw | undefined) | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts deleted file mode 100644 index c754d9aba654..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts +++ /dev/null @@ -1,21 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< - serializers.types.NestedObjectWithOptionalField.Raw, - SeedExhaustive.types.NestedObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), -}); - -export declare namespace NestedObjectWithOptionalField { - export interface Raw { - string?: string | null; - NestedObject?: ObjectWithOptionalField.Raw | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts deleted file mode 100644 index cd443843bf86..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts +++ /dev/null @@ -1,21 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; - -export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< - serializers.types.NestedObjectWithRequiredField.Raw, - SeedExhaustive.types.NestedObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), - nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), -}); - -export declare namespace NestedObjectWithRequiredField { - export interface Raw { - string: string; - NestedObject: ObjectWithOptionalField.Raw; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts deleted file mode 100644 index c7426a9b9847..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts +++ /dev/null @@ -1,21 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithMapOfMap: core.serialization.ObjectSchema< - serializers.types.ObjectWithMapOfMap.Raw, - SeedExhaustive.types.ObjectWithMapOfMap -> = core.serialization.object({ - map: core.serialization.record( - core.serialization.string(), - core.serialization.record(core.serialization.string(), core.serialization.string()), - ), -}); - -export declare namespace ObjectWithMapOfMap { - export interface Raw { - map: Record>; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts deleted file mode 100644 index 44a200707fd8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts +++ /dev/null @@ -1,42 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithOptionalField: core.serialization.ObjectSchema< - serializers.types.ObjectWithOptionalField.Raw, - SeedExhaustive.types.ObjectWithOptionalField -> = core.serialization.object({ - string: core.serialization.string().optional(), - integer: core.serialization.number().optional(), - long: core.serialization.number().optional(), - double: core.serialization.number().optional(), - bool: core.serialization.boolean().optional(), - datetime: core.serialization.date().optional(), - date: core.serialization.string().optional(), - uuid: core.serialization.string().optional(), - base64: core.serialization.string().optional(), - list: core.serialization.list(core.serialization.string()).optional(), - set: core.serialization.set(core.serialization.string()).optional(), - map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), - bigint: core.serialization.string().optional(), -}); - -export declare namespace ObjectWithOptionalField { - export interface Raw { - string?: string | null; - integer?: number | null; - long?: number | null; - double?: number | null; - bool?: boolean | null; - datetime?: string | null; - date?: string | null; - uuid?: string | null; - base64?: string | null; - list?: string[] | null; - set?: string[] | null; - map?: Record | null; - bigint?: string | null; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts deleted file mode 100644 index b6887e41337d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const ObjectWithRequiredField: core.serialization.ObjectSchema< - serializers.types.ObjectWithRequiredField.Raw, - SeedExhaustive.types.ObjectWithRequiredField -> = core.serialization.object({ - string: core.serialization.string(), -}); - -export declare namespace ObjectWithRequiredField { - export interface Raw { - string: string; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts deleted file mode 100644 index a7798d5904bf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const OptionalAlias: core.serialization.Schema< - serializers.types.OptionalAlias.Raw, - SeedExhaustive.types.OptionalAlias -> = core.serialization.string().optional(); - -export declare namespace OptionalAlias { - export type Raw = string | null | undefined; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts deleted file mode 100644 index c3c65c311b82..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./DoubleOptional.js"; -export * from "./NestedObjectWithOptionalField.js"; -export * from "./NestedObjectWithRequiredField.js"; -export * from "./ObjectWithMapOfMap.js"; -export * from "./ObjectWithOptionalField.js"; -export * from "./ObjectWithRequiredField.js"; -export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts deleted file mode 100644 index 2f88e3015854..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts deleted file mode 100644 index 83b27d0bb69d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts +++ /dev/null @@ -1,30 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; -import { Cat } from "./Cat.js"; -import { Dog } from "./Dog.js"; - -export const Animal: core.serialization.Schema = - core.serialization - .union("animal", { - dog: Dog, - cat: Cat, - }) - .transform({ - transform: (value) => value, - untransform: (value) => value, - }); - -export declare namespace Animal { - export type Raw = Animal.Dog | Animal.Cat; - - export interface Dog extends Dog.Raw { - animal: "dog"; - } - - export interface Cat extends Cat.Raw { - animal: "cat"; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts deleted file mode 100644 index 16f8a2006e5c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Cat: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToMeow: core.serialization.boolean(), - }); - -export declare namespace Cat { - export interface Raw { - name: string; - likesToMeow: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts deleted file mode 100644 index 271a1f3a4afa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import type * as SeedExhaustive from "../../../../../../api/index.js"; -import * as core from "../../../../../../core/index.js"; -import type * as serializers from "../../../../../index.js"; - -export const Dog: core.serialization.ObjectSchema = - core.serialization.object({ - name: core.serialization.string(), - likesToWoof: core.serialization.boolean(), - }); - -export declare namespace Dog { - export interface Raw { - name: string; - likesToWoof: boolean; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts deleted file mode 100644 index 342e90adc057..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./Animal.js"; -export * from "./Cat.js"; -export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts deleted file mode 100644 index b643a3e3ea27..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts +++ /dev/null @@ -1 +0,0 @@ -export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts deleted file mode 100644 index 7f5e031c8396..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This is a custom test file, if you wish to add more tests - * to your SDK. - * Be sure to mark this file in `.fernignore`. - * - * If you include example requests/responses in your fern definition, - * you will have tests automatically generated for you. - */ -describe("test", () => { - it("default", () => { - expect(true).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts deleted file mode 100644 index 954872157d52..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { RequestHandlerOptions } from "msw"; -import type { SetupServer } from "msw/node"; - -import { mockEndpointBuilder } from "./mockEndpointBuilder"; - -export interface MockServerOptions { - baseUrl: string; - server: SetupServer; -} - -export class MockServer { - private readonly server: SetupServer; - public readonly baseUrl: string; - - constructor({ baseUrl, server }: MockServerOptions) { - this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; - this.server = server; - } - - public mockEndpoint(options?: RequestHandlerOptions): ReturnType { - const builder = mockEndpointBuilder({ - once: options?.once ?? true, - onBuild: (handler) => { - this.server.use(handler); - }, - }).baseUrl(this.baseUrl); - return builder; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts deleted file mode 100644 index e1a90f7fb2e3..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { setupServer } from "msw/node"; - -import { fromJson, toJson } from "../../src/core/json"; -import { MockServer } from "./MockServer"; -import { randomBaseUrl } from "./randomBaseUrl"; - -const mswServer = setupServer(); -interface MockServerOptions { - baseUrl?: string; -} - -async function formatHttpRequest(request: Request, id?: string): Promise { - try { - const clone = request.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Request ${id} ###\n` : ""; - const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting request: ${e}`; - } -} - -async function formatHttpResponse(response: Response, id?: string): Promise { - try { - const clone = response.clone(); - const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); - - let body = ""; - try { - const contentType = clone.headers.get("content-type"); - if (contentType?.includes("application/json")) { - body = toJson(fromJson(await clone.text()), undefined, 2); - } else if (clone.body) { - body = await clone.text(); - } - } catch (_e) { - body = "(unable to parse body)"; - } - - const title = id ? `### Response for ${id} ###\n` : ""; - const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; - - return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; - } catch (e) { - return `Error formatting response: ${e}`; - } -} - -class MockServerPool { - private servers: MockServer[] = []; - - public createServer(options?: Partial): MockServer { - const baseUrl = options?.baseUrl || randomBaseUrl(); - const server = new MockServer({ baseUrl, server: mswServer }); - this.servers.push(server); - return server; - } - - public getServers(): MockServer[] { - return [...this.servers]; - } - - public listen(): void { - const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; - mswServer.listen({ onUnhandledRequest }); - - if (process.env.LOG_LEVEL === "debug") { - mswServer.events.on("request:start", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:start\n${formattedRequest}`); - }); - - mswServer.events.on("request:unhandled", async ({ request, requestId }) => { - const formattedRequest = await formatHttpRequest(request, requestId); - console.debug(`request:unhandled\n${formattedRequest}`); - }); - - mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { - const formattedResponse = await formatHttpResponse(response, requestId); - console.debug(`response:mocked\n${formattedResponse}`); - }); - } - } - - public close(): void { - this.servers = []; - mswServer.close(); - } -} - -export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts deleted file mode 100644 index 1b0e51079e6b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; - -import { url } from "../../src/core"; -import { toJson } from "../../src/core/json"; -import { withFormUrlEncoded } from "./withFormUrlEncoded"; -import { withHeaders } from "./withHeaders"; -import { withJson } from "./withJson"; - -type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; - -interface MethodStage { - baseUrl(baseUrl: string): MethodStage; - all(path: string): RequestHeadersStage; - get(path: string): RequestHeadersStage; - post(path: string): RequestHeadersStage; - put(path: string): RequestHeadersStage; - delete(path: string): RequestHeadersStage; - patch(path: string): RequestHeadersStage; - options(path: string): RequestHeadersStage; - head(path: string): RequestHeadersStage; -} - -interface RequestHeadersStage extends RequestBodyStage, ResponseStage { - header(name: string, value: string): RequestHeadersStage; - headers(headers: Record): RequestBodyStage; -} - -interface RequestBodyStage extends ResponseStage { - jsonBody(body: unknown): ResponseStage; - formUrlEncodedBody(body: unknown): ResponseStage; -} - -interface ResponseStage { - respondWith(): ResponseStatusStage; -} -interface ResponseStatusStage { - statusCode(statusCode: number): ResponseHeaderStage; -} - -interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { - header(name: string, value: string): ResponseHeaderStage; - headers(headers: Record): ResponseHeaderStage; -} - -interface ResponseBodyStage { - jsonBody(body: unknown): BuildStage; -} - -interface BuildStage { - build(): HttpHandler; -} - -export interface HttpHandlerBuilderOptions { - onBuild?: (handler: HttpHandler) => void; - once?: boolean; -} - -class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { - private method: HttpMethod = "get"; - private _baseUrl: string = ""; - private path: string = "/"; - private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - constructor(options?: HttpHandlerBuilderOptions) { - this.handlerOptions = options; - } - - baseUrl(baseUrl: string): MethodStage { - this._baseUrl = baseUrl; - return this; - } - - all(path: string): RequestHeadersStage { - this.method = "all"; - this.path = path; - return this; - } - - get(path: string): RequestHeadersStage { - this.method = "get"; - this.path = path; - return this; - } - - post(path: string): RequestHeadersStage { - this.method = "post"; - this.path = path; - return this; - } - - put(path: string): RequestHeadersStage { - this.method = "put"; - this.path = path; - return this; - } - - delete(path: string): RequestHeadersStage { - this.method = "delete"; - this.path = path; - return this; - } - - patch(path: string): RequestHeadersStage { - this.method = "patch"; - this.path = path; - return this; - } - - options(path: string): RequestHeadersStage { - this.method = "options"; - this.path = path; - return this; - } - - head(path: string): RequestHeadersStage { - this.method = "head"; - this.path = path; - return this; - } - - header(name: string, value: string): RequestHeadersStage { - this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); - return this; - } - - headers(headers: Record): RequestBodyStage { - this.predicates.push((resolver) => withHeaders(headers, resolver)); - return this; - } - - jsonBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); - } - this.predicates.push((resolver) => withJson(body, resolver)); - return this; - } - - formUrlEncodedBody(body: unknown): ResponseStage { - if (body === undefined) { - throw new Error( - "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", - ); - } - this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); - return this; - } - - respondWith(): ResponseStatusStage { - return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); - } - - private buildUrl(): string { - return url.join(this._baseUrl, this.path); - } -} - -class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { - private readonly method: HttpMethod; - private readonly url: string; - private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; - private readonly handlerOptions?: HttpHandlerBuilderOptions; - - private responseStatusCode: number = 200; - private responseHeaders: Record = {}; - private responseBody: DefaultBodyType = undefined; - - constructor( - method: HttpMethod, - url: string, - requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], - options?: HttpHandlerBuilderOptions, - ) { - this.method = method; - this.url = url; - this.requestPredicates = requestPredicates; - this.handlerOptions = options; - } - - public statusCode(code: number): ResponseHeaderStage { - this.responseStatusCode = code; - return this; - } - - public header(name: string, value: string): ResponseHeaderStage { - this.responseHeaders[name] = value; - return this; - } - - public headers(headers: Record): ResponseHeaderStage { - this.responseHeaders = { ...this.responseHeaders, ...headers }; - return this; - } - - public jsonBody(body: unknown): BuildStage { - if (body === undefined) { - throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); - } - this.responseBody = toJson(body); - return this; - } - - public build(): HttpHandler { - const responseResolver: HttpResponseResolver = () => { - const response = new HttpResponse(this.responseBody, { - status: this.responseStatusCode, - headers: this.responseHeaders, - }); - // if no Content-Type header is set, delete the default text content type that is set - if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { - response.headers.delete("Content-Type"); - } - return response; - }; - - const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); - - const handler = http[this.method](this.url, finalResolver, this.handlerOptions); - this.handlerOptions?.onBuild?.(handler); - return handler; - } -} - -export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { - return new RequestBuilder(options); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts deleted file mode 100644 index 031aa6408aca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts +++ /dev/null @@ -1,4 +0,0 @@ -export function randomBaseUrl(): string { - const randomString = Math.random().toString(36).substring(2, 15); - return `http://${randomString}.localhost`; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts deleted file mode 100644 index aeb3a95af7dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { afterAll, beforeAll } from "vitest"; - -import { mockServerPool } from "./MockServerPool"; - -beforeAll(() => { - mockServerPool.listen(); -}); -afterAll(() => { - mockServerPool.close(); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts deleted file mode 100644 index e9e6ff2d9cf1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: Record; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a form-urlencoded body."); - return passthrough(); - } - const params = new URLSearchParams(bodyText); - actualBody = {}; - for (const [key, value] of params.entries()) { - actualBody[key] = value; - } - } catch (error) { - console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).length > 0) { - console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - return { value: { actual, expected } }; - } - return {}; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if (actual[key] !== expected[key]) { - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts deleted file mode 100644 index 6599d2b4a92d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -/** - * Creates a request matcher that validates if request headers match specified criteria - * @param expectedHeaders - Headers to match against - * @param resolver - Response resolver to execute if headers match - */ -export function withHeaders( - expectedHeaders: Record boolean)>, - resolver: HttpResponseResolver, -): HttpResponseResolver { - return (args) => { - const { request } = args; - const { headers } = request; - - const mismatches: Record< - string, - { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } - > = {}; - - for (const [key, expectedValue] of Object.entries(expectedHeaders)) { - const actualValue = headers.get(key); - - if (actualValue === null) { - mismatches[key] = { actual: null, expected: expectedValue }; - continue; - } - - if (typeof expectedValue === "function") { - if (!expectedValue(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue instanceof RegExp) { - if (!expectedValue.test(actualValue)) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } else if (expectedValue !== actualValue) { - mismatches[key] = { actual: actualValue, expected: expectedValue }; - } - } - - if (Object.keys(mismatches).length > 0) { - const formattedMismatches = formatHeaderMismatches(mismatches); - console.error("Header mismatch:", formattedMismatches); - return passthrough(); - } - - return resolver(args); - }; -} - -function formatHeaderMismatches( - mismatches: Record boolean) }>, -): Record { - const formatted: Record = {}; - - for (const [key, { actual, expected }] of Object.entries(mismatches)) { - formatted[key] = { - actual, - expected: - expected instanceof RegExp - ? expected.toString() - : typeof expected === "function" - ? "[Function]" - : expected, - }; - } - - return formatted; -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts deleted file mode 100644 index b627638b015f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { type HttpResponseResolver, passthrough } from "msw"; - -import { fromJson, toJson } from "../../src/core/json"; - -/** - * Creates a request matcher that validates if the request JSON body exactly matches the expected object - * @param expectedBody - The exact body object to match against - * @param resolver - Response resolver to execute if body matches - */ -export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { - return async (args) => { - const { request } = args; - - let clonedRequest: Request; - let bodyText: string | undefined; - let actualBody: unknown; - try { - clonedRequest = request.clone(); - bodyText = await clonedRequest.text(); - if (bodyText === "") { - console.error("Request body is empty, expected a JSON object."); - return passthrough(); - } - actualBody = fromJson(bodyText); - } catch (error) { - console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); - return passthrough(); - } - - const mismatches = findMismatches(actualBody, expectedBody); - if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { - console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); - return passthrough(); - } - - return resolver(args); - }; -} - -function findMismatches(actual: any, expected: any): Record { - const mismatches: Record = {}; - - if (typeof actual !== typeof expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - - if (typeof actual !== "object" || actual === null || expected === null) { - if (actual !== expected) { - if (areEquivalent(actual, expected)) { - return {}; - } - return { value: { actual, expected } }; - } - return {}; - } - - if (Array.isArray(actual) && Array.isArray(expected)) { - if (actual.length !== expected.length) { - return { length: { actual: actual.length, expected: expected.length } }; - } - - const arrayMismatches: Record = {}; - for (let i = 0; i < actual.length; i++) { - const itemMismatches = findMismatches(actual[i], expected[i]); - if (Object.keys(itemMismatches).length > 0) { - for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { - arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; - } - } - } - return arrayMismatches; - } - - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - - const allKeys = new Set([...actualKeys, ...expectedKeys]); - - for (const key of allKeys) { - if (!expectedKeys.includes(key)) { - if (actual[key] === undefined) { - continue; // Skip undefined values in actual - } - mismatches[key] = { actual: actual[key], expected: undefined }; - } else if (!actualKeys.includes(key)) { - if (expected[key] === undefined) { - continue; // Skip undefined values in expected - } - mismatches[key] = { actual: undefined, expected: expected[key] }; - } else if ( - typeof actual[key] === "object" && - actual[key] !== null && - typeof expected[key] === "object" && - expected[key] !== null - ) { - const nestedMismatches = findMismatches(actual[key], expected[key]); - if (Object.keys(nestedMismatches).length > 0) { - for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { - mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; - } - } - } else if (actual[key] !== expected[key]) { - if (areEquivalent(actual[key], expected[key])) { - continue; - } - mismatches[key] = { actual: actual[key], expected: expected[key] }; - } - } - - return mismatches; -} - -function areEquivalent(actual: unknown, expected: unknown): boolean { - if (actual === expected) { - return true; - } - if (isEquivalentBigInt(actual, expected)) { - return true; - } - if (isEquivalentDatetime(actual, expected)) { - return true; - } - return false; -} - -function isEquivalentBigInt(actual: unknown, expected: unknown) { - if (typeof actual === "number") { - actual = BigInt(actual); - } - if (typeof expected === "number") { - expected = BigInt(expected); - } - if (typeof actual === "bigint" && typeof expected === "bigint") { - return actual === expected; - } - return false; -} - -function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { - if (typeof str1 !== "string" || typeof str2 !== "string") { - return false; - } - const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; - if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { - return false; - } - - try { - const date1 = new Date(str1).getTime(); - const date2 = new Date(str2).getTime(); - return date1 === date2; - } catch { - return false; - } -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts deleted file mode 100644 index a5651f81ba10..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { expect } from "vitest"; - -interface CustomMatchers { - toContainHeaders(expectedHeaders: Record): R; -} - -declare module "vitest" { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} - -expect.extend({ - toContainHeaders(actual: unknown, expectedHeaders: Record) { - const isHeaders = actual instanceof Headers; - const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); - - if (!isHeaders && !isPlainObject) { - throw new TypeError("Received value must be an instance of Headers or a plain object!"); - } - - if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { - throw new TypeError("Expected headers must be a plain object!"); - } - - const missingHeaders: string[] = []; - const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; - - for (const [key, value] of Object.entries(expectedHeaders)) { - let actualValue: string | null = null; - - if (isHeaders) { - // Headers.get() is already case-insensitive - actualValue = (actual as Headers).get(key); - } else { - // For plain objects, do case-insensitive lookup - const actualObj = actual as Record; - const lowerKey = key.toLowerCase(); - const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); - actualValue = foundKey ? actualObj[foundKey] : null; - } - - if (actualValue === null || actualValue === undefined) { - missingHeaders.push(key); - } else if (actualValue !== value) { - mismatchedHeaders.push({ key, expected: value, actual: actualValue }); - } - } - - const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; - - const actualType = isHeaders ? "Headers" : "object"; - - if (pass) { - return { - message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, - pass: true, - }; - } else { - const messages: string[] = []; - - if (missingHeaders.length > 0) { - messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); - } - - if (mismatchedHeaders.length > 0) { - const mismatches = mismatchedHeaders.map( - ({ key, expected, actual }) => - `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, - ); - messages.push(mismatches.join("\n")); - } - - return { - message: () => - `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, - pass: false, - }; - } - }, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json deleted file mode 100644 index a477df47920c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../tsconfig.base.json", - "compilerOptions": { - "outDir": null, - "rootDir": "..", - "baseUrl": "..", - "types": ["vitest/globals"] - }, - "include": ["../src", "../tests"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts deleted file mode 100644 index 9b5123364c47..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { BasicAuth } from "../../../src/core/auth/BasicAuth"; - -describe("BasicAuth", () => { - interface ToHeaderTestCase { - description: string; - input: { username: string; password: string }; - expected: string; - } - - interface FromHeaderTestCase { - description: string; - input: string; - expected: { username: string; password: string }; - } - - interface ErrorTestCase { - description: string; - input: string; - expectedError: string; - } - - describe("toAuthorizationHeader", () => { - const toHeaderTests: ToHeaderTestCase[] = [ - { - description: "correctly converts to header", - input: { username: "username", password: "password" }, - expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - }, - ]; - - toHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); - }); - }); - }); - - describe("fromAuthorizationHeader", () => { - const fromHeaderTests: FromHeaderTestCase[] = [ - { - description: "correctly parses header", - input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", - expected: { username: "username", password: "password" }, - }, - { - description: "handles password with colons", - input: "Basic dXNlcjpwYXNzOndvcmQ=", - expected: { username: "user", password: "pass:word" }, - }, - { - description: "handles empty username and password (just colon)", - input: "Basic Og==", - expected: { username: "", password: "" }, - }, - { - description: "handles empty username", - input: "Basic OnBhc3N3b3Jk", - expected: { username: "", password: "password" }, - }, - { - description: "handles empty password", - input: "Basic dXNlcm5hbWU6", - expected: { username: "username", password: "" }, - }, - ]; - - fromHeaderTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); - }); - }); - - const errorTests: ErrorTestCase[] = [ - { - description: "throws error for completely empty credentials", - input: "Basic ", - expectedError: "Invalid basic auth", - }, - { - description: "throws error for credentials without colon", - input: "Basic dXNlcm5hbWU=", - expectedError: "Invalid basic auth", - }, - ]; - - errorTests.forEach(({ description, input, expectedError }) => { - it(description, () => { - expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts deleted file mode 100644 index 7757b87cb97e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BearerToken } from "../../../src/core/auth/BearerToken"; - -describe("BearerToken", () => { - describe("toAuthorizationHeader", () => { - it("correctly converts to header", () => { - expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); - }); - }); - describe("fromAuthorizationHeader", () => { - it("correctly parses header", () => { - expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts deleted file mode 100644 index 939594ca277b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { base64Decode, base64Encode } from "../../src/core/base64"; - -describe("base64", () => { - describe("base64Encode", () => { - it("should encode ASCII strings", () => { - expect(base64Encode("hello")).toBe("aGVsbG8="); - expect(base64Encode("")).toBe(""); - }); - - it("should encode UTF-8 strings", () => { - expect(base64Encode("café")).toBe("Y2Fmw6k="); - expect(base64Encode("🎉")).toBe("8J+OiQ=="); - }); - - it("should handle basic auth credentials", () => { - expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); - }); - }); - - describe("base64Decode", () => { - it("should decode ASCII strings", () => { - expect(base64Decode("aGVsbG8=")).toBe("hello"); - expect(base64Decode("")).toBe(""); - }); - - it("should decode UTF-8 strings", () => { - expect(base64Decode("Y2Fmw6k=")).toBe("café"); - expect(base64Decode("8J+OiQ==")).toBe("🎉"); - }); - - it("should handle basic auth credentials", () => { - expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); - }); - }); - - describe("round-trip encoding", () => { - const testStrings = [ - "hello world", - "test@example.com", - "café", - "username:password", - "user@domain.com:super$ecret123!", - ]; - - testStrings.forEach((testString) => { - it(`should round-trip encode/decode: "${testString}"`, () => { - const encoded = base64Encode(testString); - const decoded = base64Decode(encoded); - expect(decoded).toBe(testString); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts deleted file mode 100644 index 60df2b5e4824..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts +++ /dev/null @@ -1,261 +0,0 @@ -import fs from "fs"; -import { join } from "path"; -import stream from "stream"; -import type { BinaryResponse } from "../../../src/core"; -import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -describe("Test fetcherImpl", () => { - it("should handle successful request", async () => { - const mockArgs: Fetcher.Args = { - url: "https://httpbin.org/post", - method: "POST", - headers: { "X-Test": "x-test-header" }, - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - maxRetries: 0, - responseType: "json", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - - expect(global.fetch).toHaveBeenCalledWith( - "https://httpbin.org/post", - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: JSON.stringify({ data: "test" }), - }), - ); - }); - - it("should send octet stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "POST", - headers: { "X-Test": "x-test-header" }, - contentType: "application/octet-stream", - requestType: "bytes", - maxRetries: 0, - responseType: "json", - body: fs.createReadStream(join(__dirname, "test-file.txt")), - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - }), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "POST", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - body: expect.any(fs.ReadStream), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.body).toEqual({ data: "test" }); - } - }); - - it("should receive file as stream", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.stream).toBe("function"); - const stream = body.stream(); - expect(stream).toBeInstanceOf(ReadableStream); - const reader = stream.getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as blob", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.blob).toBe("function"); - const blob = await body.blob(); - expect(blob).toBeInstanceOf(Blob); - const reader = blob.stream().getReader(); - const { value } = await reader.read(); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as arraybuffer", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.arrayBuffer).toBe("function"); - const arrayBuffer = await body.arrayBuffer(); - expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); - - it("should receive file as bytes", async () => { - const url = "https://httpbin.org/post/file"; - const mockArgs: Fetcher.Args = { - url, - method: "GET", - headers: { "X-Test": "x-test-header" }, - maxRetries: 0, - responseType: "binary-response", - }; - - global.fetch = vi.fn().mockResolvedValue( - new Response( - stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, - { - status: 200, - statusText: "OK", - }, - ), - ); - - const result = await fetcherImpl(mockArgs); - - expect(global.fetch).toHaveBeenCalledWith( - url, - expect.objectContaining({ - method: "GET", - headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), - }), - ); - expect(result.ok).toBe(true); - if (result.ok) { - const body = result.body as BinaryResponse; - expect(body).toBeDefined(); - expect(body.bodyUsed).toBe(false); - expect(typeof body.bytes).toBe("function"); - if (!body.bytes) { - return; - } - const bytes = await body.bytes(); - expect(bytes).toBeInstanceOf(Uint8Array); - const decoder = new TextDecoder(); - const streamContent = decoder.decode(bytes); - expect(streamContent).toBe("This is a test file!\n"); - expect(body.bodyUsed).toBe(true); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts deleted file mode 100644 index 2ec008e581d8..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; - -import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; -import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("HttpResponsePromise", () => { - const mockRawResponse: RawResponse = { - headers: new Headers(), - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - const mockData = { id: "123", name: "test" }; - const mockWithRawResponse: WithRawResponse = { - data: mockData, - rawResponse: mockRawResponse, - }; - - describe("fromFunction", () => { - it("should create an HttpResponsePromise from a function", async () => { - const mockFn = vi - .fn<(arg1: string, arg2: string) => Promise>>() - .mockResolvedValue(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); - - const result = await responsePromise; - expect(result).toEqual(mockData); - expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromPromise", () => { - it("should create an HttpResponsePromise from a promise", async () => { - const promise = Promise.resolve(mockWithRawResponse); - - const responsePromise = HttpResponsePromise.fromPromise(promise); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromExecutor", () => { - it("should create an HttpResponsePromise from an executor function", async () => { - const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { - resolve(mockWithRawResponse); - }); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("fromResult", () => { - it("should create an HttpResponsePromise from a result", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise; - expect(result).toEqual(mockData); - - const resultWithRawResponse = await responsePromise.withRawResponse(); - expect(resultWithRawResponse).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); - - describe("Promise methods", () => { - let responsePromise: HttpResponsePromise; - - beforeEach(() => { - responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - }); - - it("should support then() method", async () => { - const result = await responsePromise.then((data) => ({ - ...data, - modified: true, - })); - - expect(result).toEqual({ - ...mockData, - modified: true, - }); - }); - - it("should support catch() method", async () => { - const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { - reject(new Error("Test error")); - }); - - const catchSpy = vi.fn(); - await errorResponsePromise.catch(catchSpy); - - expect(catchSpy).toHaveBeenCalled(); - const error = catchSpy.mock.calls[0]?.[0]; - expect(error).toBeInstanceOf(Error); - expect((error as Error).message).toBe("Test error"); - }); - - it("should support finally() method", async () => { - const finallySpy = vi.fn(); - await responsePromise.finally(finallySpy); - - expect(finallySpy).toHaveBeenCalled(); - }); - }); - - describe("withRawResponse", () => { - it("should return both data and raw response", async () => { - const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); - - const result = await responsePromise.withRawResponse(); - - expect(result).toEqual({ - data: mockData, - rawResponse: mockRawResponse, - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts deleted file mode 100644 index 375ee3f38064..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; - -describe("RawResponse", () => { - describe("toRawResponse", () => { - it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { - const mockHeaders = new Headers({ "content-type": "application/json" }); - const mockResponse = { - body: "test body", - bodyUsed: false, - ok: true, - headers: mockHeaders, - redirected: false, - status: 200, - statusText: "OK", - type: "basic" as ResponseType, - url: "https://example.com", - }; - - const result = toRawResponse(mockResponse as unknown as Response); - - expect("body" in result).toBe(false); - expect("bodyUsed" in result).toBe(false); - expect("ok" in result).toBe(false); - expect(result.headers).toBe(mockHeaders); - expect(result.redirected).toBe(false); - expect(result.status).toBe(200); - expect(result.statusText).toBe("OK"); - expect(result.type).toBe("basic"); - expect(result.url).toBe("https://example.com"); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts deleted file mode 100644 index a92f1b5e81d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; - -describe("Test createRequestUrl", () => { - const BASE_URL = "https://api.example.com"; - - interface TestCase { - description: string; - baseUrl: string; - queryParams?: Record; - expected: string; - } - - const testCases: TestCase[] = [ - { - description: "should return the base URL when no query parameters are provided", - baseUrl: BASE_URL, - expected: BASE_URL, - }, - { - description: "should append simple query parameters", - baseUrl: BASE_URL, - queryParams: { key: "value", another: "param" }, - expected: "https://api.example.com?key=value&another=param", - }, - { - description: "should handle array query parameters", - baseUrl: BASE_URL, - queryParams: { items: ["a", "b", "c"] }, - expected: "https://api.example.com?items=a&items=b&items=c", - }, - { - description: "should handle object query parameters", - baseUrl: BASE_URL, - queryParams: { filter: { name: "John", age: 30 } }, - expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", - }, - { - description: "should handle mixed types of query parameters", - baseUrl: BASE_URL, - queryParams: { - simple: "value", - array: ["x", "y"], - object: { key: "value" }, - }, - expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", - }, - { - description: "should handle empty query parameters object", - baseUrl: BASE_URL, - queryParams: {}, - expected: BASE_URL, - }, - { - description: "should encode special characters in query parameters", - baseUrl: BASE_URL, - queryParams: { special: "a&b=c d" }, - expected: "https://api.example.com?special=a%26b%3Dc%20d", - }, - { - description: "should handle numeric values", - baseUrl: BASE_URL, - queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, - expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", - }, - { - description: "should handle boolean values", - baseUrl: BASE_URL, - queryParams: { enabled: true, disabled: false }, - expected: "https://api.example.com?enabled=true&disabled=false", - }, - { - description: "should handle null and undefined values", - baseUrl: BASE_URL, - queryParams: { - valid: "value", - nullValue: null, - undefinedValue: undefined, - emptyString: "", - }, - expected: "https://api.example.com?valid=value&nullValue=&emptyString=", - }, - { - description: "should handle deeply nested objects", - baseUrl: BASE_URL, - queryParams: { - user: { - profile: { - name: "John", - settings: { theme: "dark" }, - }, - }, - }, - expected: - "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle arrays of objects", - baseUrl: BASE_URL, - queryParams: { - users: [ - { name: "John", age: 30 }, - { name: "Jane", age: 25 }, - ], - }, - expected: - "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", - }, - { - description: "should handle mixed arrays", - baseUrl: BASE_URL, - queryParams: { - mixed: ["string", 42, true, { key: "value" }], - }, - expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", - }, - { - description: "should handle empty arrays", - baseUrl: BASE_URL, - queryParams: { emptyArray: [] }, - expected: BASE_URL, - }, - { - description: "should handle empty objects", - baseUrl: BASE_URL, - queryParams: { emptyObject: {} }, - expected: BASE_URL, - }, - { - description: "should handle special characters in keys", - baseUrl: BASE_URL, - queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, - expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", - }, - { - description: "should handle URL with existing query parameters", - baseUrl: "https://api.example.com?existing=param", - queryParams: { new: "value" }, - expected: "https://api.example.com?existing=param?new=value", - }, - { - description: "should handle complex nested structures", - baseUrl: BASE_URL, - queryParams: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - ]; - - testCases.forEach(({ description, baseUrl, queryParams, expected }) => { - it(description, () => { - expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts deleted file mode 100644 index 8a6c3a57e211..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getRequestBody", () => { - interface TestCase { - description: string; - input: any; - type: "json" | "form" | "file" | "bytes" | "other"; - expected: any; - skipCondition?: () => boolean; - } - - const testCases: TestCase[] = [ - { - description: "should stringify body if not FormData in Node environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "node", - }, - { - description: "should stringify body if not FormData in browser environment", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - skipCondition: () => RUNTIME.type !== "browser", - }, - { - description: "should return the Uint8Array", - input: new Uint8Array([1, 2, 3]), - type: "bytes", - expected: new Uint8Array([1, 2, 3]), - }, - { - description: "should serialize objects for form-urlencoded content type", - input: { username: "johndoe", email: "john@example.com" }, - type: "form", - expected: "username=johndoe&email=john%40example.com", - }, - { - description: "should serialize complex nested objects and arrays for form-urlencoded content type", - input: { - user: { - profile: { - name: "John Doe", - settings: { - theme: "dark", - notifications: true, - }, - }, - tags: ["admin", "user"], - contacts: [ - { type: "email", value: "john@example.com" }, - { type: "phone", value: "+1234567890" }, - ], - }, - filters: { - status: ["active", "pending"], - metadata: { - created: "2024-01-01", - categories: ["electronics", "books"], - }, - }, - preferences: ["notifications", "updates"], - }, - type: "form", - expected: - "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + - "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + - "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + - "user%5Btags%5D=admin&" + - "user%5Btags%5D=user&" + - "user%5Bcontacts%5D%5Btype%5D=email&" + - "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + - "user%5Bcontacts%5D%5Btype%5D=phone&" + - "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + - "filters%5Bstatus%5D=active&" + - "filters%5Bstatus%5D=pending&" + - "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + - "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + - "filters%5Bmetadata%5D%5Bcategories%5D=books&" + - "preferences=notifications&" + - "preferences=updates", - }, - { - description: "should return the input for pre-serialized form-urlencoded strings", - input: "key=value&another=param", - type: "other", - expected: "key=value&another=param", - }, - { - description: "should JSON stringify objects", - input: { key: "value" }, - type: "json", - expected: '{"key":"value"}', - }, - ]; - - testCases.forEach(({ description, input, type, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const result = await getRequestBody({ - body: input, - type, - }); - - if (input instanceof Uint8Array) { - expect(result).toBe(input); - } else { - expect(result).toBe(expected); - } - }); - }); - - it("should return FormData in browser environment", async () => { - if (RUNTIME.type === "browser") { - const formData = new FormData(); - formData.append("key", "value"); - const result = await getRequestBody({ - body: formData, - type: "file", - }); - expect(result).toBe(formData); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts deleted file mode 100644 index ad6be7fc2c9b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; - -import { RUNTIME } from "../../../src/core/runtime"; - -describe("Test getResponseBody", () => { - interface SimpleTestCase { - description: string; - responseData: string | Record; - responseType?: "blob" | "sse" | "streaming" | "text"; - expected: any; - skipCondition?: () => boolean; - } - - const simpleTestCases: SimpleTestCase[] = [ - { - description: "should handle text response type", - responseData: "test text", - responseType: "text", - expected: "test text", - }, - { - description: "should handle JSON response", - responseData: { key: "value" }, - expected: { key: "value" }, - }, - { - description: "should handle empty response", - responseData: "", - expected: undefined, - }, - { - description: "should handle non-JSON response", - responseData: "invalid json", - expected: { - ok: false, - error: { - reason: "non-json", - statusCode: 200, - rawBody: "invalid json", - }, - }, - }, - ]; - - simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { - it(description, async () => { - if (skipCondition?.()) { - return; - } - - const mockResponse = new Response( - typeof responseData === "string" ? responseData : JSON.stringify(responseData), - ); - const result = await getResponseBody(mockResponse, responseType); - expect(result).toEqual(expected); - }); - }); - - it("should handle blob response type", async () => { - const mockBlob = new Blob(["test"], { type: "text/plain" }); - const mockResponse = new Response(mockBlob); - const result = await getResponseBody(mockResponse, "blob"); - // @ts-expect-error - expect(result.constructor.name).toBe("Blob"); - }); - - it("should handle sse response type", async () => { - if (RUNTIME.type === "node") { - const mockStream = new ReadableStream(); - const mockResponse = new Response(mockStream); - const result = await getResponseBody(mockResponse, "sse"); - expect(result).toBe(mockStream); - } - }); - - it("should handle streaming response type", async () => { - const encoder = new TextEncoder(); - const testData = "test stream data"; - const mockStream = new ReadableStream({ - start(controller) { - controller.enqueue(encoder.encode(testData)); - controller.close(); - }, - }); - - const mockResponse = new Response(mockStream); - const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; - - expect(result).toBeInstanceOf(ReadableStream); - - const reader = result.getReader(); - const decoder = new TextDecoder(); - const { value } = await reader.read(); - const streamContent = decoder.decode(value); - expect(streamContent).toBe(testData); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts deleted file mode 100644 index 366c9b6ced61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts +++ /dev/null @@ -1,517 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Fetcher Logging Integration", () => { - describe("Request Logging", () => { - it("should log successful request at debug level", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - headers: { "Content-Type": "application/json" }, - body: { test: "data" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - }), - hasBody: true, - }), - ); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - method: "POST", - url: "https://example.com/api", - statusCode: 200, - }), - ); - }); - - it("should not log debug messages at info level for successful requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "info", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - }); - - it("should log request with body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: true, - }), - ); - }); - - it("should log request without body flag", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - hasBody: false, - }), - ); - }); - - it("should not log when silent mode is enabled", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: true, - }, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should not log when no logging config is provided", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - }); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Error Logging", () => { - it("should log 4xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Not found" }, 404, "Not Found"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 404, - }), - ); - }); - - it("should log 5xx errors at error level", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - statusCode: 500, - }), - ); - }); - - it("should log aborted request errors", async () => { - const mockLogger = createMockLogger(); - - const abortController = new AbortController(); - abortController.abort(); - - global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - abortSignal: abortController.signal, - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request was aborted", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - }), - ); - }); - - it("should log timeout errors", async () => { - const mockLogger = createMockLogger(); - - const timeoutError = new Error("Request timeout"); - timeoutError.name = "AbortError"; - - global.fetch = vi.fn().mockRejectedValue(timeoutError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request timed out", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - timeoutMs: undefined, - }), - ); - }); - - it("should log unknown errors", async () => { - const mockLogger = createMockLogger(); - - const unknownError = new Error("Unknown error"); - - global.fetch = vi.fn().mockRejectedValue(unknownError); - - const result = await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(result.ok).toBe(false); - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error", - expect.objectContaining({ - method: "GET", - url: "https://example.com/api", - errorMessage: "Unknown error", - }), - ); - }); - }); - - describe("Logging with Redaction", () => { - it("should redact sensitive data in error logs", async () => { - const mockLogger = createMockLogger(); - mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]", - }), - ); - }); - }); - - describe("Different HTTP Methods", () => { - it("should log GET requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "GET", - }), - ); - }); - - it("should log POST requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "POST", - }), - ); - }); - - it("should log PUT requests", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "PUT", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "PUT", - }), - ); - }); - - it("should log DELETE requests", async () => { - const mockLogger = createMockLogger(); - global.fetch = vi.fn().mockResolvedValue( - new Response(null, { - status: 200, - statusText: "OK", - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "DELETE", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - method: "DELETE", - }), - ); - }); - }); - - describe("Status Code Logging", () => { - it("should log 2xx success status codes", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 201, "Created"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "POST", - body: { data: "test" }, - contentType: "application/json", - requestType: "json", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 201, - }), - ); - }); - - it("should log 3xx redirect status codes as success", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - statusCode: 301, - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts deleted file mode 100644 index ea49466a55fc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Mock } from "vitest"; -import { makeRequest } from "../../../src/core/fetcher/makeRequest"; - -describe("Test makeRequest", () => { - const mockPostUrl = "https://httpbin.org/post"; - const mockGetUrl = "https://httpbin.org/get"; - const mockHeaders = { "Content-Type": "application/json" }; - const mockBody = JSON.stringify({ key: "value" }); - - let mockFetch: Mock; - - beforeEach(() => { - mockFetch = vi.fn(); - mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); - }); - - it("should handle POST request correctly", async () => { - const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockPostUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "POST", - headers: mockHeaders, - body: mockBody, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); - - it("should handle GET request correctly", async () => { - const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); - const responseBody = await response.json(); - expect(responseBody).toEqual({ test: "successful" }); - expect(mockFetch).toHaveBeenCalledTimes(1); - const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; - expect(calledUrl).toBe(mockGetUrl); - expect(calledOptions).toEqual( - expect.objectContaining({ - method: "GET", - headers: mockHeaders, - body: undefined, - credentials: undefined, - }), - ); - expect(calledOptions.signal).toBeDefined(); - expect(calledOptions.signal).toBeInstanceOf(AbortSignal); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts deleted file mode 100644 index d599376b9bcf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts +++ /dev/null @@ -1,1115 +0,0 @@ -import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify(data), { - status, - statusText, - }), - ); -} - -describe("Redacting Logic", () => { - describe("Header Redaction", () => { - it("should redact authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Authorization: "Bearer secret-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - }), - }), - ); - }); - - it("should redact api-key header (case-insensitive)", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-API-KEY": "secret-api-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-API-KEY": "[REDACTED]", - }), - }), - ); - }); - - it("should redact cookie header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { Cookie: "session=abc123; token=xyz789" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Cookie: "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-auth-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "x-auth-token": "auth-token-12345" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "x-auth-token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact proxy-authorization header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "Proxy-Authorization": "Basic credentials" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Proxy-Authorization": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-csrf-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-CSRF-Token": "csrf-token-abc" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-CSRF-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should redact www-authenticate header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "WWW-Authenticate": "Bearer realm=example" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "WWW-Authenticate": "[REDACTED]", - }), - }), - ); - }); - - it("should redact x-session-token header", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { "X-Session-Token": "session-token-xyz" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "X-Session-Token": "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive headers", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - "Content-Type": "application/json", - "User-Agent": "Test/1.0", - Accept: "application/json", - }), - }), - ); - }); - - it("should redact multiple sensitive headers at once", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - headers: { - Authorization: "Bearer token", - "X-API-Key": "api-key", - Cookie: "session=123", - "Content-Type": "application/json", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - headers: expect.toContainHeaders({ - Authorization: "[REDACTED]", - "X-API-Key": "[REDACTED]", - Cookie: "[REDACTED]", - "Content-Type": "application/json", - }), - }), - ); - }); - }); - - describe("Response Header Redaction", () => { - it("should redact Set-Cookie in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "set-cookie": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact authorization in response headers", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("Authorization", "Bearer token-123"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ data: "test" }), { - status: 200, - statusText: "OK", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "HTTP request succeeded", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - authorization: "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - - it("should redact response headers in error responses", async () => { - const mockLogger = createMockLogger(); - - const mockHeaders = new Headers(); - mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); - mockHeaders.set("Content-Type", "application/json"); - - global.fetch = vi.fn().mockResolvedValue( - new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - statusText: "Unauthorized", - headers: mockHeaders, - }), - ); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "error", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.error).toHaveBeenCalledWith( - "HTTP request failed with error status", - expect.objectContaining({ - responseHeaders: expect.toContainHeaders({ - "www-authenticate": "[REDACTED]", - "content-type": "application/json", - }), - }), - ); - }); - }); - - describe("Query Parameter Redaction", () => { - it("should redact api_key query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { api_key: "secret-key" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - api_key: "[REDACTED]", - }), - }), - ); - }); - - it("should redact token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact access_token query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { access_token: "secret-access-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - access_token: "[REDACTED]", - }), - }), - ); - }); - - it("should redact password query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { password: "secret-password" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - password: "[REDACTED]", - }), - }), - ); - }); - - it("should redact secret query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { secret: "secret-value" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - secret: "[REDACTED]", - }), - }), - ); - }); - - it("should redact session_id query parameter", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { session_id: "session-123" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - session_id: "[REDACTED]", - }), - }), - ); - }); - - it("should not redact non-sensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - page: "1", - limit: "10", - sort: "name", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - page: "1", - limit: "10", - sort: "name", - }), - }), - ); - }); - - it("should not redact parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { - author: "john", - authenticate: "false", - authorization_level: "user", - }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - author: "john", - authenticate: "false", - authorization_level: "user", - }), - }), - ); - }); - - it("should handle undefined query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: undefined, - }), - ); - }); - - it("should redact case-insensitive query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - queryParameters: expect.objectContaining({ - API_KEY: "[REDACTED]", - Token: "[REDACTED]", - }), - }), - ); - }); - }); - - describe("URL Redaction", () => { - it("should redact credentials in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:password@example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api", - }), - ); - }); - - it("should redact api_key in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret-key&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&page=1", - }), - ); - }); - - it("should redact token in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret-token", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should redact password in query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?username=user&password=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?username=user&password=[REDACTED]", - }), - ); - }); - - it("should not redact non-sensitive query strings", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name", - }), - ); - }); - - it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?author=john&authenticate=false&page=1", - }), - ); - }); - - it("should handle URL with fragment", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?token=secret#section", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?token=[REDACTED]#section", - }), - ); - }); - - it("should redact URL-encoded query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api%5Fkey=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api%5Fkey=[REDACTED]", - }), - ); - }); - - it("should handle URL without query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api", - }), - ); - }); - - it("should handle empty query string", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?", - }), - ); - }); - - it("should redact multiple sensitive parameters in URL", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?api_key=secret1&token=secret2&page=1", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", - }), - ); - }); - - it("should redact both credentials and query parameters", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/api?token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/api?token=[REDACTED]", - }), - ); - }); - - it("should use fast path for URLs without sensitive keywords", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", - }), - ); - }); - - it("should handle query parameter without value", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?flag&token=secret", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?flag&token=[REDACTED]", - }), - ); - }); - - it("should handle URL with multiple @ symbols in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user@example.com:pass@host.com/api", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@host.com/api", - }), - ); - }); - - it("should handle URL with @ in query parameter but not in credentials", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://example.com/api?email=user@example.com", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://example.com/api?email=user@example.com", - }), - ); - }); - - it("should handle URL with both credentials and @ in path", async () => { - const mockLogger = createMockLogger(); - mockSuccessResponse(); - - await fetcherImpl({ - url: "https://user:pass@example.com/users/@username", - method: "GET", - responseType: "json", - maxRetries: 0, - logging: { - level: "debug", - logger: mockLogger, - silent: false, - }, - }); - - expect(mockLogger.debug).toHaveBeenCalledWith( - "Making HTTP request", - expect.objectContaining({ - url: "https://[REDACTED]@example.com/users/@username", - }), - ); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts deleted file mode 100644 index d22661367f4e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -import type { Mock, MockInstance } from "vitest"; -import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; - -describe("requestWithRetries", () => { - let mockFetch: Mock; - let originalMathRandom: typeof Math.random; - let setTimeoutSpy: MockInstance; - - beforeEach(() => { - mockFetch = vi.fn(); - originalMathRandom = Math.random; - - Math.random = vi.fn(() => 0.5); - - vi.useFakeTimers({ - toFake: [ - "setTimeout", - "clearTimeout", - "setInterval", - "clearInterval", - "setImmediate", - "clearImmediate", - "Date", - "performance", - "requestAnimationFrame", - "cancelAnimationFrame", - "requestIdleCallback", - "cancelIdleCallback", - ], - }); - }); - - afterEach(() => { - Math.random = originalMathRandom; - vi.clearAllMocks(); - vi.clearAllTimers(); - }); - - it("should retry on retryable status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const retryableStatuses = [408, 429, 500, 502]; - let callCount = 0; - - mockFetch.mockImplementation(async () => { - if (callCount < retryableStatuses.length) { - return new Response("", { status: retryableStatuses[callCount++] }); - } - return new Response("", { status: 200 }); - }); - - const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); - expect(response.status).toBe(200); - }); - - it("should respect maxRetries limit", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const maxRetries = 2; - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - expect(response.status).toBe(500); - }); - - it("should not retry on success status codes", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const successStatuses = [200, 201, 202]; - - for (const status of successStatuses) { - mockFetch.mockReset(); - setTimeoutSpy.mockClear(); - mockFetch.mockResolvedValueOnce(new Response("", { status })); - - const responsePromise = requestWithRetries(() => mockFetch(), 3); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(mockFetch).toHaveBeenCalledTimes(1); - expect(setTimeoutSpy).not.toHaveBeenCalled(); - } - }); - - interface RetryHeaderTestCase { - description: string; - headerName: string; - headerValue: string | (() => string); - expectedDelayMin: number; - expectedDelayMax: number; - } - - const retryHeaderTests: RetryHeaderTestCase[] = [ - { - description: "should respect retry-after header with seconds value", - headerName: "retry-after", - headerValue: "5", - expectedDelayMin: 4000, - expectedDelayMax: 6000, - }, - { - description: "should respect retry-after header with HTTP date value", - headerName: "retry-after", - headerValue: () => new Date(Date.now() + 3000).toUTCString(), - expectedDelayMin: 2000, - expectedDelayMax: 4000, - }, - { - description: "should respect x-ratelimit-reset header", - headerName: "x-ratelimit-reset", - headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), - expectedDelayMin: 3000, - expectedDelayMax: 6000, - }, - ]; - - retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { - it(description, async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - const value = typeof headerValue === "function" ? headerValue() : headerValue; - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ [headerName]: value }), - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); - const actualDelay = setTimeoutSpy.mock.calls[0][1]; - expect(actualDelay).toBeGreaterThan(expectedDelayMin); - expect(actualDelay).toBeLessThan(expectedDelayMax); - expect(response.status).toBe(200); - }); - }); - - it("should apply correct exponential backoff with jitter", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch.mockResolvedValue(new Response("", { status: 500 })); - const maxRetries = 3; - const expectedDelays = [1000, 2000, 4000]; - - const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); - await vi.runAllTimersAsync(); - await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); - - expectedDelays.forEach((delay, index) => { - expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); - }); - - expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); - }); - - it("should handle concurrent retries independently", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 500 })) - .mockResolvedValueOnce(new Response("", { status: 200 })) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const promise1 = requestWithRetries(() => mockFetch(), 1); - const promise2 = requestWithRetries(() => mockFetch(), 1); - - await vi.runAllTimersAsync(); - const [response1, response2] = await Promise.all([promise1, promise2]); - - expect(response1.status).toBe(200); - expect(response2.status).toBe(200); - }); - - it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { - setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { - process.nextTick(callback); - return null as any; - }); - - mockFetch - .mockResolvedValueOnce( - new Response("", { - status: 429, - headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) - }), - ) - .mockResolvedValueOnce(new Response("", { status: 200 })); - - const responsePromise = requestWithRetries(() => mockFetch(), 1); - await vi.runAllTimersAsync(); - const response = await responsePromise; - - expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); - expect(response.status).toBe(200); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts deleted file mode 100644 index d7b6d1e63caa..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; - -describe("Test getTimeoutSignal", () => { - beforeEach(() => { - vi.useFakeTimers(); - }); - - afterEach(() => { - vi.useRealTimers(); - }); - - it("should return an object with signal and abortId", () => { - const { signal, abortId } = getTimeoutSignal(1000); - - expect(signal).toBeDefined(); - expect(abortId).toBeDefined(); - expect(signal).toBeInstanceOf(AbortSignal); - expect(signal.aborted).toBe(false); - }); - - it("should create a signal that aborts after the specified timeout", () => { - const timeoutMs = 5000; - const { signal } = getTimeoutSignal(timeoutMs); - - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(timeoutMs - 1); - expect(signal.aborted).toBe(false); - - vi.advanceTimersByTime(1); - expect(signal.aborted).toBe(true); - }); -}); - -describe("Test anySignal", () => { - it("should return an AbortSignal", () => { - const signal = anySignal(new AbortController().signal); - expect(signal).toBeInstanceOf(AbortSignal); - }); - - it("should abort when any of the input signals is aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal(controller1.signal, controller2.signal); - - expect(signal.aborted).toBe(false); - controller1.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should handle an array of signals", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - const signal = anySignal([controller1.signal, controller2.signal]); - - expect(signal.aborted).toBe(false); - controller2.abort(); - expect(signal.aborted).toBe(true); - }); - - it("should abort immediately if one of the input signals is already aborted", () => { - const controller1 = new AbortController(); - const controller2 = new AbortController(); - controller1.abort(); - - const signal = anySignal(controller1.signal, controller2.signal); - expect(signal.aborted).toBe(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt deleted file mode 100644 index c66d471e359c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts deleted file mode 100644 index 2e0b5fe5040c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts +++ /dev/null @@ -1,454 +0,0 @@ -import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; - -function createMockLogger() { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; -} - -describe("Logger", () => { - describe("LogLevel", () => { - it("should have correct log levels", () => { - expect(LogLevel.Debug).toBe("debug"); - expect(LogLevel.Info).toBe("info"); - expect(LogLevel.Warn).toBe("warn"); - expect(LogLevel.Error).toBe("error"); - }); - }); - - describe("ConsoleLogger", () => { - let consoleLogger: ConsoleLogger; - let consoleSpy: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - consoleLogger = new ConsoleLogger(); - consoleSpy = { - debug: vi.spyOn(console, "debug").mockImplementation(() => {}), - info: vi.spyOn(console, "info").mockImplementation(() => {}), - warn: vi.spyOn(console, "warn").mockImplementation(() => {}), - error: vi.spyOn(console, "error").mockImplementation(() => {}), - }; - }); - - afterEach(() => { - consoleSpy.debug.mockRestore(); - consoleSpy.info.mockRestore(); - consoleSpy.warn.mockRestore(); - consoleSpy.error.mockRestore(); - }); - - it("should log debug messages", () => { - consoleLogger.debug("debug message", { data: "test" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); - }); - - it("should log info messages", () => { - consoleLogger.info("info message", { data: "test" }); - expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); - }); - - it("should log warn messages", () => { - consoleLogger.warn("warn message", { data: "test" }); - expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); - }); - - it("should log error messages", () => { - consoleLogger.error("error message", { data: "test" }); - expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); - }); - - it("should handle multiple arguments", () => { - consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); - expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); - }); - }); - - describe("Logger with level filtering", () => { - let mockLogger: { - debug: ReturnType; - info: ReturnType; - warn: ReturnType; - error: ReturnType; - }; - - beforeEach(() => { - mockLogger = createMockLogger(); - }); - - describe("Debug level", () => { - it("should log all levels when set to debug", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).toHaveBeenCalledWith("debug"); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(true); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Info level", () => { - it("should log info, warn, and error when set to info", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).toHaveBeenCalledWith("info"); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(true); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Warn level", () => { - it("should log warn and error when set to warn", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).toHaveBeenCalledWith("warn"); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(true); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Error level", () => { - it("should only log error when set to error", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).toHaveBeenCalledWith("error"); - }); - - it("should report correct level checks", () => { - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(true); - }); - }); - - describe("Silent mode", () => { - it("should not log anything when silent is true", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - logger.debug("debug"); - logger.info("info"); - logger.warn("warn"); - logger.error("error"); - - expect(mockLogger.debug).not.toHaveBeenCalled(); - expect(mockLogger.info).not.toHaveBeenCalled(); - expect(mockLogger.warn).not.toHaveBeenCalled(); - expect(mockLogger.error).not.toHaveBeenCalled(); - }); - - it("should report all level checks as false when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.isDebug()).toBe(false); - expect(logger.isInfo()).toBe(false); - expect(logger.isWarn()).toBe(false); - expect(logger.isError()).toBe(false); - }); - }); - - describe("shouldLog", () => { - it("should correctly determine if level should be logged", () => { - const logger = new Logger({ - level: LogLevel.Info, - logger: mockLogger, - silent: false, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(true); - expect(logger.shouldLog(LogLevel.Warn)).toBe(true); - expect(logger.shouldLog(LogLevel.Error)).toBe(true); - }); - - it("should return false for all levels when silent", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: true, - }); - - expect(logger.shouldLog(LogLevel.Debug)).toBe(false); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - expect(logger.shouldLog(LogLevel.Warn)).toBe(false); - expect(logger.shouldLog(LogLevel.Error)).toBe(false); - }); - }); - - describe("Multiple arguments", () => { - it("should pass multiple arguments to logger", () => { - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message", "arg1", { key: "value" }, 123); - expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); - }); - }); - }); - - describe("createLogger", () => { - it("should return default logger when no config provided", () => { - const logger = createLogger(); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should return same logger instance when Logger is passed", () => { - const customLogger = new Logger({ - level: LogLevel.Debug, - logger: new ConsoleLogger(), - silent: false, - }); - - const result = createLogger(customLogger); - expect(result).toBe(customLogger); - }); - - it("should create logger with custom config", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Warn, - logger: mockLogger, - silent: false, - }); - - expect(logger).toBeInstanceOf(Logger); - logger.warn("test"); - expect(mockLogger.warn).toHaveBeenCalledWith("test"); - }); - - it("should use default values for missing config", () => { - const logger = createLogger({}); - expect(logger).toBeInstanceOf(Logger); - }); - - it("should override default level", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("test"); - expect(mockLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should override default silent mode", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - silent: false, - }); - - logger.info("test"); - expect(mockLogger.info).toHaveBeenCalledWith("test"); - }); - - it("should use provided logger implementation", () => { - const customLogger = createMockLogger(); - - const logger = createLogger({ - logger: customLogger, - level: LogLevel.Debug, - silent: false, - }); - - logger.debug("test"); - expect(customLogger.debug).toHaveBeenCalledWith("test"); - }); - - it("should default to silent: true", () => { - const mockLogger = createMockLogger(); - - const logger = createLogger({ - logger: mockLogger, - level: LogLevel.Debug, - }); - - logger.debug("test"); - expect(mockLogger.debug).not.toHaveBeenCalled(); - }); - }); - - describe("Default logger", () => { - it("should have silent: true by default", () => { - const logger = createLogger(); - expect(logger.shouldLog(LogLevel.Info)).toBe(false); - }); - - it("should not log when using default logger", () => { - const logger = createLogger(); - - logger.info("test"); - expect(logger.isInfo()).toBe(false); - }); - }); - - describe("Edge cases", () => { - it("should handle empty message", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug(""); - expect(mockLogger.debug).toHaveBeenCalledWith(""); - }); - - it("should handle no arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - logger.debug("message"); - expect(mockLogger.debug).toHaveBeenCalledWith("message"); - }); - - it("should handle complex objects", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Debug, - logger: mockLogger, - silent: false, - }); - - const complexObject = { - nested: { key: "value" }, - array: [1, 2, 3], - fn: () => "test", - }; - - logger.debug("message", complexObject); - expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); - }); - - it("should handle errors as arguments", () => { - const mockLogger = createMockLogger(); - - const logger = new Logger({ - level: LogLevel.Error, - logger: mockLogger, - silent: false, - }); - - const error = new Error("Test error"); - logger.error("Error occurred", error); - expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts deleted file mode 100644 index 498f143c7283..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { bigint } from "../../../../src/core/schemas/builders/bigint"; -import { itJson, itParse, itSchema } from "../utils/itSchema"; -import { itValidateJson, itValidateParse } from "../utils/itValidate"; - -describe("bigint", () => { - itSchema("converts between raw bigint and parsed bigint", bigint(), { - raw: BigInt("9007199254740992"), - parsed: BigInt("9007199254740992"), - }); - - itParse("converts between raw number and parsed bigint", bigint(), { - raw: 10, - parsed: BigInt("10"), - }); - - itParse("converts between raw number and parsed bigint", bigint(), { - raw: BigInt("10"), - parsed: BigInt("10"), - }); - - itJson("converts raw bigint to parsed bigint", bigint(), { - parsed: BigInt("10"), - raw: BigInt("10"), - }); - - itValidateParse("string", bigint(), "42", [ - { - message: 'Expected bigint | number. Received "42".', - path: [], - }, - ]); - - itValidateJson("number", bigint(), 42, [ - { - message: "Expected bigint. Received 42.", - path: [], - }, - ]); - - itValidateJson("string", bigint(), "42", [ - { - message: 'Expected bigint. Received "42".', - path: [], - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts deleted file mode 100644 index 2790268a09c6..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { date } from "../../../../src/core/schemas/builders/date"; -import { itSchema } from "../utils/itSchema"; -import { itValidateJson, itValidateParse } from "../utils/itValidate"; - -describe("date", () => { - itSchema("converts between raw ISO string and parsed Date", date(), { - raw: "2022-09-29T05:41:21.939Z", - parsed: new Date("2022-09-29T05:41:21.939Z"), - }); - - itValidateParse("non-string", date(), 42, [ - { - message: "Expected string. Received 42.", - path: [], - }, - ]); - - itValidateParse("non-ISO", date(), "hello world", [ - { - message: 'Expected ISO 8601 date string. Received "hello world".', - path: [], - }, - ]); - - itValidateJson("non-Date", date(), "hello", [ - { - message: 'Expected Date object. Received "hello".', - path: [], - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts deleted file mode 100644 index d1707325b29b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { enum_ } from "../../../../src/core/schemas/builders/enum"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("enum", () => { - itSchemaIdentity(enum_(["A", "B", "C"]), "A"); - - itSchemaIdentity(enum_(["A", "B", "C"]), "D" as any, { - opts: { allowUnrecognizedEnumValues: true }, - }); - - itValidate("invalid enum", enum_(["A", "B", "C"]), "D", [ - { - message: 'Expected enum. Received "D".', - path: [], - }, - ]); - - itValidate( - "non-string", - enum_(["A", "B", "C"]), - [], - [ - { - message: "Expected string. Received list.", - path: [], - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts deleted file mode 100644 index a82ace4a08c0..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { lazy, list, object, string } from "../../../../src/core/schemas/builders"; -import type { Schema } from "../../../../src/core/schemas/Schema"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("lazy", () => { - it("doesn't run immediately", () => { - let wasRun = false; - lazy(() => { - wasRun = true; - return string(); - }); - expect(wasRun).toBe(false); - }); - - it("only runs first time", async () => { - let count = 0; - const schema = lazy(() => { - count++; - return string(); - }); - await schema.parse("hello"); - await schema.json("world"); - expect(count).toBe(1); - }); - - itSchemaIdentity( - lazy(() => object({})), - { foo: "hello" }, - { - title: "passes opts through", - opts: { unrecognizedObjectKeys: "passthrough" }, - }, - ); - - itSchemaIdentity( - lazy(() => object({ foo: string() })), - { foo: "hello" }, - ); - - // eslint-disable-next-line vi/expect-expect - it("self-referencial schema doesn't compile", () => { - () => { - // @ts-expect-error - const a = lazy(() => object({ foo: a })); - }; - }); - - // eslint-disable-next-line vi/expect-expect - it("self-referencial compiles with explicit type", () => { - () => { - interface TreeNode { - children: TreeNode[]; - } - const TreeNode: Schema = lazy(() => object({ children: list(TreeNode) })); - }; - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts deleted file mode 100644 index 9b443671a71f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { lazyObject, number, object, string } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("lazy", () => { - itSchemaIdentity( - lazyObject(() => object({ foo: string() })), - { foo: "hello" }, - ); - - itSchemaIdentity( - lazyObject(() => object({ foo: string() })).extend(object({ bar: number() })), - { - foo: "hello", - bar: 42, - }, - { title: "returned schema has object utils" }, - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts deleted file mode 100644 index 8b7d5e40cfaf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { object } from "../../../../../src/core/schemas/builders/object"; -import { schemaB } from "./b"; - -// @ts-expect-error -export const schemaA = object({ - b: schemaB, -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts deleted file mode 100644 index fb219d54c8e5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { object } from "../../../../../src/core/schemas/builders/object"; -import { optional } from "../../../../../src/core/schemas/builders/schema-utils"; -import { schemaA } from "./a"; - -// @ts-expect-error -export const schemaB = object({ - a: optional(schemaA), -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts deleted file mode 100644 index 108789b7317d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { list, object, property, string } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("list", () => { - itSchemaIdentity(list(string()), ["hello", "world"], { - title: "functions as identity when item type is primitive", - }); - - itSchema( - "converts objects correctly", - list( - object({ - helloWorld: property("hello_world", string()), - }), - ), - { - raw: [{ hello_world: "123" }], - parsed: [{ helloWorld: "123" }], - }, - ); - - itValidate("not a list", list(string()), 42, [ - { - path: [], - message: "Expected list. Received 42.", - }, - ]); - - itValidate( - "invalid item type", - list(string()), - [42], - [ - { - path: ["[0]"], - message: "Expected string. Received 42.", - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts deleted file mode 100644 index fa6c88873c61..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { stringLiteral } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("stringLiteral", () => { - itSchemaIdentity(stringLiteral("A"), "A"); - - itValidate("incorrect string", stringLiteral("A"), "B", [ - { - path: [], - message: 'Expected "A". Received "B".', - }, - ]); - - itValidate("non-string", stringLiteral("A"), 42, [ - { - path: [], - message: 'Expected "A". Received 42.', - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts deleted file mode 100644 index b18bc9d3e5df..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; - -describe("withParsedProperties", () => { - it("Added properties included on parsed object", async () => { - const schema = object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }).withParsedProperties({ - printFoo: (parsed) => () => parsed.foo, - printHelloWorld: () => () => "Hello world", - helloWorld: "Hello world", - }); - - const parsed = await schema.parse({ raw_foo: "value of foo", bar: "bar" }); - if (!parsed.ok) { - throw new Error("Failed to parse"); - } - expect(parsed.value.printFoo()).toBe("value of foo"); - expect(parsed.value.printHelloWorld()).toBe("Hello world"); - expect(parsed.value.helloWorld).toBe("Hello world"); - }); - - it("Added property is removed on raw object", async () => { - const schema = object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }).withParsedProperties({ - printFoo: (parsed) => () => parsed.foo, - }); - - const original = { raw_foo: "value of foo", bar: "bar" } as const; - const parsed = await schema.parse(original); - if (!parsed.ok) { - throw new Error("Failed to parse()"); - } - - const raw = await schema.json(parsed.value); - - if (!raw.ok) { - throw new Error("Failed to json()"); - } - - expect(raw.value).toEqual(original); - }); - - describe("compile", () => { - // eslint-disable-next-line vi/expect-expect - it("doesn't compile with non-object schema", () => { - () => - object({ - foo: string(), - }) - // @ts-expect-error - .withParsedProperties(42); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts deleted file mode 100644 index b6c2920f4d3e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { boolean, object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; - -describe("extend", () => { - itSchemaIdentity( - object({ - foo: string(), - }).extend( - object({ - bar: stringLiteral("bar"), - }), - ), - { - foo: "", - bar: "bar", - } as const, - { - title: "extended properties are included in schema", - }, - ); - - itSchemaIdentity( - object({ - foo: string(), - }) - .extend( - object({ - bar: stringLiteral("bar"), - }), - ) - .extend( - object({ - baz: boolean(), - }), - ), - { - foo: "", - bar: "bar", - baz: true, - } as const, - { - title: "extensions can be extended", - }, - ); - - itSchema( - "converts nested object", - object({ - item: object({ - helloWorld: property("hello_world", string()), - }), - }).extend( - object({ - goodbye: property("goodbye_raw", string()), - }), - ), - { - raw: { item: { hello_world: "yo" }, goodbye_raw: "peace" }, - parsed: { item: { helloWorld: "yo" }, goodbye: "peace" }, - }, - ); - - itSchema( - "extensions work with raw/parsed property name conversions", - object({ - item: property("item_raw", string()), - }).extend( - object({ - goodbye: property("goodbye_raw", string()), - }), - ), - { - raw: { item_raw: "hi", goodbye_raw: "peace" }, - parsed: { item: "hi", goodbye: "peace" }, - }, - ); - - describe("compile", () => { - // eslint-disable-next-line vi/expect-expect - it("doesn't compile with non-object schema", () => { - () => - object({ - foo: string(), - }) - // @ts-expect-error - .extend([]); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts deleted file mode 100644 index a8d9fe0a1359..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts +++ /dev/null @@ -1,255 +0,0 @@ -import { any, number, object, property, string, stringLiteral, unknown } from "../../../../src/core/schemas/builders"; -import { itJson, itParse, itSchema, itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("object", () => { - itSchemaIdentity( - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - { - foo: "", - bar: "bar", - }, - { - title: "functions as identity when values are primitives and property() isn't used", - }, - ); - - itSchema( - "uses raw key from property()", - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { raw_foo: "foo", bar: "bar" }, - parsed: { foo: "foo", bar: "bar" }, - }, - ); - - itSchema( - "keys with unknown type can be omitted", - object({ - foo: unknown(), - }), - { - raw: {}, - parsed: {}, - }, - ); - - itSchema( - "keys with any type can be omitted", - object({ - foo: any(), - }), - { - raw: {}, - parsed: {}, - }, - ); - - describe("unrecognizedObjectKeys", () => { - describe("parse", () => { - itParse( - 'includes unknown values when unrecognizedObjectKeys === "passthrough"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - parsed: { - foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - opts: { - unrecognizedObjectKeys: "passthrough", - }, - }, - ); - - itParse( - 'strips unknown values when unrecognizedObjectKeys === "strip"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - parsed: { - foo: "foo", - bar: "bar", - }, - opts: { - unrecognizedObjectKeys: "strip", - }, - }, - ); - }); - - describe("json", () => { - itJson( - 'includes unknown values when unrecognizedObjectKeys === "passthrough"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - parsed: { - foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - opts: { - unrecognizedObjectKeys: "passthrough", - }, - }, - ); - - itJson( - 'strips unknown values when unrecognizedObjectKeys === "strip"', - object({ - foo: property("raw_foo", string()), - bar: stringLiteral("bar"), - }), - { - raw: { - raw_foo: "foo", - bar: "bar", - }, - parsed: { - foo: "foo", - bar: "bar", - // @ts-expect-error - baz: "yoyo", - }, - opts: { - unrecognizedObjectKeys: "strip", - }, - }, - ); - }); - }); - - describe("nullish properties", () => { - itSchema("missing properties are not added", object({ foo: property("raw_foo", string().optional()) }), { - raw: {}, - parsed: {}, - }); - - itSchema("undefined properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }); - - itSchema("null properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }); - - describe("extensions", () => { - itSchema( - "undefined properties are not dropped", - object({}).extend(object({ foo: property("raw_foo", string().optional()) })), - { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }, - ); - - describe("parse()", () => { - itParse( - "null properties are not dropped", - object({}).extend(object({ foo: property("raw_foo", string().optional()) })), - { - raw: { raw_foo: null }, - parsed: { foo: undefined }, - }, - ); - }); - }); - }); - - itValidate( - "missing property", - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - { foo: "hello" }, - [ - { - path: [], - message: 'Missing required key "bar"', - }, - ], - ); - - itValidate( - "extra property", - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - { foo: "hello", bar: "bar", baz: 42 }, - [ - { - path: ["baz"], - message: 'Unexpected key "baz"', - }, - ], - ); - - itValidate( - "not an object", - object({ - foo: string(), - bar: stringLiteral("bar"), - }), - [], - [ - { - path: [], - message: "Expected object. Received list.", - }, - ], - ); - - itValidate( - "nested validation error", - object({ - foo: object({ - bar: number(), - }), - }), - { foo: { bar: "hello" } }, - [ - { - path: ["foo", "bar"], - message: 'Expected number. Received "hello".', - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts deleted file mode 100644 index efcd83afae79..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { objectWithoutOptionalProperties, string, stringLiteral } from "../../../../src/core/schemas/builders"; -import { itSchema } from "../utils/itSchema"; - -describe("objectWithoutOptionalProperties", () => { - itSchema( - "all properties are required", - objectWithoutOptionalProperties({ - foo: string(), - bar: stringLiteral("bar").optional(), - }), - { - raw: { - foo: "hello", - }, - // @ts-expect-error - parsed: { - foo: "hello", - }, - }, - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts deleted file mode 100644 index c8770fca17dc..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { object, string, stringLiteral } from "../../../../src/core/schemas/builders"; -import { itJson, itParse, itSchema } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("passthrough", () => { - const baseSchema = object({ - foo: string(), - bar: stringLiteral("bar"), - }); - - describe("parse", () => { - itParse("includes unknown values", baseSchema.passthrough(), { - raw: { - foo: "hello", - bar: "bar", - baz: "extra", - }, - parsed: { - foo: "hello", - bar: "bar", - baz: "extra", - }, - }); - - itValidate( - "preserves schema validation", - baseSchema.passthrough(), - { - foo: 123, - bar: "bar", - baz: "extra", - }, - [ - { - path: ["foo"], - message: "Expected string. Received 123.", - }, - ], - ); - }); - - describe("json", () => { - itJson("includes unknown values", baseSchema.passthrough(), { - raw: { - foo: "hello", - bar: "bar", - - baz: "extra", - }, - parsed: { - foo: "hello", - bar: "bar", - - baz: "extra", - }, - }); - - itValidate( - "preserves schema validation", - baseSchema.passthrough(), - { - foo: "hello", - bar: "wrong", - baz: "extra", - }, - [ - { - path: ["bar"], - message: 'Expected "bar". Received "wrong".', - }, - ], - ); - }); - - itSchema("preserves schema validation in both directions", baseSchema.passthrough(), { - raw: { - foo: "hello", - bar: "bar", - extra: 42, - }, - parsed: { - foo: "hello", - bar: "bar", - extra: 42, - }, - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts deleted file mode 100644 index 1adbbe2a8380..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { any } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("any", () => { - itSchemaIdentity(any(), true); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts deleted file mode 100644 index 897a8295dca7..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { boolean } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("boolean", () => { - itSchemaIdentity(boolean(), true); - - itValidate("non-boolean", boolean(), {}, [ - { - path: [], - message: "Expected boolean. Received object.", - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts deleted file mode 100644 index 1d18eba052ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { never } from "../../../../src/core/schemas/builders"; - -describe("never", () => { - it("always fails to parse", () => { - const schema = never(); - const result = schema.parse("test"); - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.errors).toHaveLength(1); - expect(result.errors[0]?.message).toBe("Expected never"); - } - }); - - it("always fails to json", () => { - const schema = never(); - const result = schema.json("test"); - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.errors).toHaveLength(1); - expect(result.errors[0]?.message).toBe("Expected never"); - } - }); - - it("fails with any value including undefined", () => { - const schema = never(); - expect(schema.parse(undefined).ok).toBe(false); - expect(schema.parse(null).ok).toBe(false); - expect(schema.parse(0).ok).toBe(false); - expect(schema.parse("").ok).toBe(false); - expect(schema.parse({}).ok).toBe(false); - expect(schema.parse([]).ok).toBe(false); - }); - - it("works when called without options parameter", () => { - const schema = never(); - // This tests that the default = {} parameter works correctly - const result = schema.parse("test"); - expect(result.ok).toBe(false); - if (!result.ok) { - expect(result.errors).toHaveLength(1); - expect(result.errors[0]?.message).toBe("Expected never"); - expect(result.errors[0]?.path).toEqual([]); - } - }); - - it("succeeds with skipValidation", () => { - const schema = never(); - const result = schema.parse("test", { skipValidation: true }); - expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value).toBe("test"); - } - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts deleted file mode 100644 index 2d01415a60ba..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { number } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("number", () => { - itSchemaIdentity(number(), 42); - - itValidate("non-number", number(), "hello", [ - { - path: [], - message: 'Expected number. Received "hello".', - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts deleted file mode 100644 index 57b2368784ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { string } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("string", () => { - itSchemaIdentity(string(), "hello"); - - itValidate("non-string", string(), 42, [ - { - path: [], - message: "Expected string. Received 42.", - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts deleted file mode 100644 index 4d17a7dbd005..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { unknown } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; - -describe("unknown", () => { - itSchemaIdentity(unknown(), true); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts deleted file mode 100644 index e07f3e7cb00d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { number, record, string } from "../../../../src/core/schemas/builders"; -import { itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("record", () => { - itSchemaIdentity(record(string(), string()), { hello: "world" }); - itSchemaIdentity(record(number(), string()), { 42: "world" }); - - itValidate( - "non-record", - record(number(), string()), - [], - [ - { - path: [], - message: "Expected object. Received list.", - }, - ], - ); - - itValidate("invalid key type", record(number(), string()), { hello: "world" }, [ - { - path: ["hello (key)"], - message: 'Expected number. Received "hello".', - }, - ]); - - itValidate("invalid value type", record(string(), number()), { hello: "world" }, [ - { - path: ["hello"], - message: 'Expected number. Received "world".', - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts deleted file mode 100644 index 822c3ca4e5a4..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { object, string } from "../../../../src/core/schemas/builders"; -import { itSchema } from "../utils/itSchema"; - -describe("getSchemaUtils", () => { - describe("optional()", () => { - itSchema("optional fields allow original schema", string().optional(), { - raw: "hello", - parsed: "hello", - }); - - itSchema("optional fields are not required", string().optional(), { - raw: null, - parsed: undefined, - }); - }); - - describe("transform()", () => { - itSchema( - "transform and untransform run correctly", - string().transform({ - transform: (x) => `${x}X`, - untransform: (x) => (x as string).slice(0, -1), - }), - { - raw: "hello", - parsed: "helloX", - }, - ); - }); - - describe("parseOrThrow()", () => { - it("parses valid value", async () => { - const value = string().parseOrThrow("hello"); - expect(value).toBe("hello"); - }); - - it("throws on invalid value", async () => { - const value = () => object({ a: string(), b: string() }).parseOrThrow({ a: 24 }); - expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); - }); - }); - - describe("jsonOrThrow()", () => { - it("serializes valid value", async () => { - const value = string().jsonOrThrow("hello"); - expect(value).toBe("hello"); - }); - - it("throws on invalid value", async () => { - const value = () => object({ a: string(), b: string() }).jsonOrThrow({ a: 24 }); - expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); - }); - }); - - describe("omitUndefined", () => { - it("serializes undefined as null", async () => { - const value = object({ - a: string().optional(), - b: string().optional(), - }).jsonOrThrow({ - a: "hello", - b: undefined, - }); - expect(value).toEqual({ a: "hello", b: null }); - }); - - it("omits undefined values", async () => { - const value = object({ - a: string().optional(), - b: string().optional(), - }).jsonOrThrow( - { - a: "hello", - b: undefined, - }, - { - omitUndefined: true, - }, - ); - expect(value).toEqual({ a: "hello" }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts deleted file mode 100644 index 13842ff40157..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { - boolean, - discriminant, - list, - number, - object, - string, - stringLiteral, - union, -} from "../../../src/core/schemas/builders"; -import { booleanLiteral } from "../../../src/core/schemas/builders/literals/booleanLiteral"; -import { property } from "../../../src/core/schemas/builders/object/property"; -import { itSchema } from "./utils/itSchema"; - -describe("Schema", () => { - itSchema( - "large nested object", - object({ - a: string(), - b: stringLiteral("b value"), - c: property( - "raw_c", - list( - object({ - animal: union(discriminant("type", "_type"), { - dog: object({ value: boolean() }), - cat: object({ value: property("raw_cat", number()) }), - }), - }), - ), - ), - d: property("raw_d", boolean()), - e: booleanLiteral(true), - }), - { - raw: { - a: "hello", - b: "b value", - raw_c: [ - { - animal: { - _type: "dog", - value: true, - }, - }, - { - animal: { - _type: "cat", - raw_cat: 42, - }, - }, - ], - raw_d: false, - e: true, - }, - parsed: { - a: "hello", - b: "b value", - c: [ - { - animal: { - type: "dog", - value: true, - }, - }, - { - animal: { - type: "cat", - value: 42, - }, - }, - ], - d: false, - e: true, - }, - }, - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts deleted file mode 100644 index 53a1652c8bbb..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { set, string } from "../../../../src/core/schemas/builders"; -import { itSchema } from "../utils/itSchema"; -import { itValidateJson, itValidateParse } from "../utils/itValidate"; - -describe("set", () => { - itSchema("converts between raw list and parsed Set", set(string()), { - raw: ["A", "B"], - parsed: new Set(["A", "B"]), - }); - - itValidateParse("not a list", set(string()), 42, [ - { - path: [], - message: "Expected list. Received 42.", - }, - ]); - - itValidateJson( - "not a Set", - set(string()), - [], - [ - { - path: [], - message: "Expected Set. Received list.", - }, - ], - ); - - itValidateParse( - "invalid item type", - set(string()), - [42], - [ - { - path: ["[0]"], - message: "Expected string. Received 42.", - }, - ], - ); - - itValidateJson("invalid item type", set(string()), new Set([42]), [ - { - path: ["[0]"], - message: "Expected string. Received 42.", - }, - ]); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts deleted file mode 100644 index 3283555949ab..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable no-console */ -import { boolean, number, object, property, string, undiscriminatedUnion } from "../../../src/core/schemas/builders"; - -describe("skipValidation", () => { - it("allows data that doesn't conform to the schema", async () => { - const warningLogs: string[] = []; - const originalConsoleWarn = console.warn; - console.warn = (...args) => warningLogs.push(args.join(" ")); - - const schema = object({ - camelCase: property("snake_case", string()), - numberProperty: number(), - requiredProperty: boolean(), - anyPrimitive: undiscriminatedUnion([string(), number(), boolean()]), - }); - - const parsed = await schema.parse( - { - snake_case: "hello", - numberProperty: "oops", - anyPrimitive: true, - }, - { - skipValidation: true, - }, - ); - - expect(parsed).toEqual({ - ok: true, - value: { - camelCase: "hello", - numberProperty: "oops", - anyPrimitive: true, - }, - }); - - expect(warningLogs).toEqual([ - `Failed to validate. - - numberProperty: Expected number. Received "oops".`, - ]); - - console.warn = originalConsoleWarn; - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts deleted file mode 100644 index 01dcadbba37b..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { number, object, property, string, undiscriminatedUnion } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; - -describe("undiscriminatedUnion", () => { - itSchemaIdentity(undiscriminatedUnion([string(), number()]), "hello world"); - - itSchemaIdentity(undiscriminatedUnion([object({ hello: string() }), object({ goodbye: string() })]), { - goodbye: "foo", - }); - - itSchema( - "Correctly transforms", - undiscriminatedUnion([object({ hello: string() }), object({ helloWorld: property("hello_world", string()) })]), - { - raw: { hello_world: "foo " }, - parsed: { helloWorld: "foo " }, - }, - ); - - it("Returns errors for all variants", async () => { - const result = await undiscriminatedUnion([string(), number()]).parse(true); - if (result.ok) { - throw new Error("Unexpectedly passed validation"); - } - expect(result.errors).toEqual([ - { - message: "[Variant 0] Expected string. Received true.", - path: [], - }, - { - message: "[Variant 1] Expected number. Received true.", - path: [], - }, - ]); - }); - - describe("compile", () => { - // eslint-disable-next-line vi/expect-expect - it("doesn't compile with zero members", () => { - // @ts-expect-error - () => undiscriminatedUnion([]); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts deleted file mode 100644 index 1f5d7a8fad5c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { boolean, discriminant, number, object, string, union } from "../../../../src/core/schemas/builders"; -import { itSchema, itSchemaIdentity } from "../utils/itSchema"; -import { itValidate } from "../utils/itValidate"; - -describe("union", () => { - itSchemaIdentity( - union("type", { - lion: object({ - meows: boolean(), - }), - giraffe: object({ - heightInInches: number(), - }), - }), - { type: "lion", meows: true }, - { title: "doesn't transform discriminant when it's a string" }, - ); - - itSchema( - "transforms discriminant when it's a discriminant()", - union(discriminant("type", "_type"), { - lion: object({ meows: boolean() }), - giraffe: object({ heightInInches: number() }), - }), - { - raw: { _type: "lion", meows: true }, - parsed: { type: "lion", meows: true }, - }, - ); - - describe("allowUnrecognizedUnionMembers", () => { - itSchema( - "transforms discriminant & passes through values when discriminant value is unrecognized", - union(discriminant("type", "_type"), { - lion: object({ meows: boolean() }), - giraffe: object({ heightInInches: number() }), - }), - { - // @ts-expect-error - raw: { _type: "moose", isAMoose: true }, - // @ts-expect-error - parsed: { type: "moose", isAMoose: true }, - opts: { - allowUnrecognizedUnionMembers: true, - }, - }, - ); - }); - - describe("withParsedProperties", () => { - it("Added property is included on parsed object", async () => { - const schema = union("type", { - lion: object({}), - tiger: object({ value: string() }), - }).withParsedProperties({ - printType: (parsed) => () => parsed.type, - }); - - const parsed = await schema.parse({ type: "lion" }); - if (!parsed.ok) { - throw new Error("Failed to parse"); - } - expect(parsed.value.printType()).toBe("lion"); - }); - }); - - itValidate( - "non-object", - union("type", { - lion: object({}), - tiger: object({ value: string() }), - }), - [], - [ - { - path: [], - message: "Expected object. Received list.", - }, - ], - ); - - itValidate( - "missing discriminant", - union("type", { - lion: object({}), - tiger: object({ value: string() }), - }), - {}, - [ - { - path: [], - message: 'Missing discriminant ("type")', - }, - ], - ); - - itValidate( - "unrecognized discriminant value", - union("type", { - lion: object({}), - tiger: object({ value: string() }), - }), - { - type: "bear", - }, - [ - { - path: ["type"], - message: 'Expected enum. Received "bear".', - }, - ], - ); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts deleted file mode 100644 index 25b13e643207..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable vi/no-export */ -import type { Schema, SchemaOptions } from "../../../../src/core/schemas/Schema"; - -export function itSchemaIdentity( - schema: Schema, - value: T, - { title = "functions as identity", opts }: { title?: string; opts?: SchemaOptions } = {}, -): void { - itSchema(title, schema, { raw: value, parsed: value, opts }); -} - -export function itSchema( - title: string, - schema: Schema, - { - raw, - parsed, - opts, - only = false, - }: { - raw: Raw; - parsed: Parsed; - opts?: SchemaOptions; - only?: boolean; - }, -): void { - // eslint-disable-next-line vi/valid-title - (only ? describe.only : describe)(title, () => { - itParse("parse()", schema, { raw, parsed, opts }); - itJson("json()", schema, { raw, parsed, opts }); - }); -} - -export function itParse( - title: string, - schema: Schema, - { - raw, - parsed, - opts, - }: { - raw: Raw; - parsed: Parsed; - opts?: SchemaOptions; - }, -): void { - // eslint-disable-next-line vi/valid-title - it(title, () => { - const maybeValid = schema.parse(raw, opts); - if (!maybeValid.ok) { - throw new Error(`Failed to parse() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); - } - expect(maybeValid.value).toStrictEqual(parsed); - }); -} - -export function itJson( - title: string, - schema: Schema, - { - raw, - parsed, - opts, - }: { - raw: Raw; - parsed: Parsed; - opts?: SchemaOptions; - }, -): void { - // eslint-disable-next-line vi/valid-title - it(title, () => { - const maybeValid = schema.json(parsed, opts); - if (!maybeValid.ok) { - throw new Error(`Failed to json() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); - } - expect(maybeValid.value).toStrictEqual(raw); - }); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts deleted file mode 100644 index 60bc56c123cf..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable vi/no-export */ -import type { Schema, SchemaOptions, ValidationError } from "../../../../src/core/schemas/Schema"; - -export function itValidate( - title: string, - schema: Schema, - input: unknown, - errors: ValidationError[], - opts?: SchemaOptions, -): void { - // eslint-disable-next-line vi/valid-title - describe("parse()", () => { - itValidateParse(title, schema, input, errors, opts); - }); - describe("json()", () => { - itValidateJson(title, schema, input, errors, opts); - }); -} - -export function itValidateParse( - title: string, - schema: Schema, - raw: unknown, - errors: ValidationError[], - opts?: SchemaOptions, -): void { - describe("parse", () => { - // eslint-disable-next-line vi/valid-title - it(title, async () => { - const maybeValid = await schema.parse(raw, opts); - if (maybeValid.ok) { - throw new Error("Value passed validation"); - } - expect(maybeValid.errors).toStrictEqual(errors); - }); - }); -} - -export function itValidateJson( - title: string, - schema: Schema, - parsed: unknown, - errors: ValidationError[], - opts?: SchemaOptions, -): void { - describe("json", () => { - // eslint-disable-next-line vi/valid-title - it(title, async () => { - const maybeValid = await schema.json(parsed, opts); - if (maybeValid.ok) { - throw new Error("Value passed validation"); - } - expect(maybeValid.errors).toStrictEqual(errors); - }); - }); -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts deleted file mode 100644 index 123488f084ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts +++ /dev/null @@ -1,284 +0,0 @@ -import { join } from "../../../src/core/url/index"; - -describe("join", () => { - interface TestCase { - description: string; - base: string; - segments: string[]; - expected: string; - } - - describe("basic functionality", () => { - const basicTests: TestCase[] = [ - { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, - { - description: "should return empty string for empty base with path", - base: "", - segments: ["path"], - expected: "", - }, - { - description: "should handle single segment", - base: "base", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with trailing slash on base", - base: "base/", - segments: ["segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with leading slash", - base: "base", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle single segment with both slashes", - base: "base/", - segments: ["/segment"], - expected: "base/segment", - }, - { - description: "should handle multiple segments", - base: "base", - segments: ["path1", "path2", "path3"], - expected: "base/path1/path2/path3", - }, - { - description: "should handle multiple segments with slashes", - base: "base/", - segments: ["/path1/", "/path2/", "/path3/"], - expected: "base/path1/path2/path3/", - }, - ]; - - basicTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("URL handling", () => { - const urlTests: TestCase[] = [ - { - description: "should handle absolute URLs", - base: "https://example.com", - segments: ["api", "v1"], - expected: "https://example.com/api/v1", - }, - { - description: "should handle absolute URLs with slashes", - base: "https://example.com/", - segments: ["/api/", "/v1/"], - expected: "https://example.com/api/v1/", - }, - { - description: "should handle absolute URLs with base path", - base: "https://example.com/base", - segments: ["api", "v1"], - expected: "https://example.com/base/api/v1", - }, - { - description: "should preserve URL query parameters", - base: "https://example.com?query=1", - segments: ["api"], - expected: "https://example.com/api?query=1", - }, - { - description: "should preserve URL fragments", - base: "https://example.com#fragment", - segments: ["api"], - expected: "https://example.com/api#fragment", - }, - { - description: "should preserve URL query and fragments", - base: "https://example.com?query=1#fragment", - segments: ["api"], - expected: "https://example.com/api?query=1#fragment", - }, - { - description: "should handle http protocol", - base: "http://example.com", - segments: ["api"], - expected: "http://example.com/api", - }, - { - description: "should handle ftp protocol", - base: "ftp://example.com", - segments: ["files"], - expected: "ftp://example.com/files", - }, - { - description: "should handle ws protocol", - base: "ws://example.com", - segments: ["socket"], - expected: "ws://example.com/socket", - }, - { - description: "should fallback to path joining for malformed URLs", - base: "not-a-url://", - segments: ["path"], - expected: "not-a-url:///path", - }, - ]; - - urlTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("edge cases", () => { - const edgeCaseTests: TestCase[] = [ - { - description: "should handle empty segments", - base: "base", - segments: ["", "path"], - expected: "base/path", - }, - { - description: "should handle null segments", - base: "base", - segments: [null as any, "path"], - expected: "base/path", - }, - { - description: "should handle undefined segments", - base: "base", - segments: [undefined as any, "path"], - expected: "base/path", - }, - { - description: "should handle segments with only single slash", - base: "base", - segments: ["/", "path"], - expected: "base/path", - }, - { - description: "should handle segments with only double slash", - base: "base", - segments: ["//", "path"], - expected: "base/path", - }, - { - description: "should handle base paths with trailing slashes", - base: "base/", - segments: ["path"], - expected: "base/path", - }, - { - description: "should handle complex nested paths", - base: "api/v1/", - segments: ["/users/", "/123/", "/profile"], - expected: "api/v1/users/123/profile", - }, - ]; - - edgeCaseTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("real-world scenarios", () => { - const realWorldTests: TestCase[] = [ - { - description: "should handle API endpoint construction", - base: "https://api.example.com/v1", - segments: ["users", "123", "posts"], - expected: "https://api.example.com/v1/users/123/posts", - }, - { - description: "should handle file path construction", - base: "/var/www", - segments: ["html", "assets", "images"], - expected: "/var/www/html/assets/images", - }, - { - description: "should handle relative path construction", - base: "../parent", - segments: ["child", "grandchild"], - expected: "../parent/child/grandchild", - }, - { - description: "should handle Windows-style paths", - base: "C:\\Users", - segments: ["Documents", "file.txt"], - expected: "C:\\Users/Documents/file.txt", - }, - ]; - - realWorldTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); - - describe("performance scenarios", () => { - it("should handle many segments efficiently", () => { - const segments = Array(100).fill("segment"); - const result = join("base", ...segments); - expect(result).toBe(`base/${segments.join("/")}`); - }); - - it("should handle long URLs", () => { - const longPath = "a".repeat(1000); - expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); - }); - }); - - describe("trailing slash preservation", () => { - const trailingSlashTests: TestCase[] = [ - { - description: - "should preserve trailing slash on final result when base has trailing slash and no segments", - base: "https://api.example.com/", - segments: [], - expected: "https://api.example.com/", - }, - { - description: "should preserve trailing slash on v1 path", - base: "https://api.example.com/v1/", - segments: [], - expected: "https://api.example.com/v1/", - }, - { - description: "should preserve trailing slash when last segment has trailing slash", - base: "https://api.example.com", - segments: ["users/"], - expected: "https://api.example.com/users/", - }, - { - description: "should preserve trailing slash with relative path", - base: "api/v1", - segments: ["users/"], - expected: "api/v1/users/", - }, - { - description: "should preserve trailing slash with multiple segments", - base: "https://api.example.com", - segments: ["v1", "collections/"], - expected: "https://api.example.com/v1/collections/", - }, - { - description: "should preserve trailing slash with base path", - base: "base", - segments: ["path1", "path2/"], - expected: "base/path1/path2/", - }, - ]; - - trailingSlashTests.forEach(({ description, base, segments, expected }) => { - it(description, () => { - expect(join(base, ...segments)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts deleted file mode 100644 index 42cdffb9e5ea..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { toQueryString } from "../../../src/core/url/index"; - -describe("Test qs toQueryString", () => { - interface BasicTestCase { - description: string; - input: any; - expected: string; - } - - describe("Basic functionality", () => { - const basicTests: BasicTestCase[] = [ - { description: "should return empty string for null", input: null, expected: "" }, - { description: "should return empty string for undefined", input: undefined, expected: "" }, - { description: "should return empty string for string primitive", input: "hello", expected: "" }, - { description: "should return empty string for number primitive", input: 42, expected: "" }, - { description: "should return empty string for true boolean", input: true, expected: "" }, - { description: "should return empty string for false boolean", input: false, expected: "" }, - { description: "should handle empty objects", input: {}, expected: "" }, - { - description: "should handle simple key-value pairs", - input: { name: "John", age: 30 }, - expected: "name=John&age=30", - }, - ]; - - basicTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Array handling", () => { - interface ArrayTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const arrayTests: ArrayTestCase[] = [ - { - description: "should handle arrays with indices format (default)", - input: { items: ["a", "b", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", - }, - { - description: "should handle arrays with repeat format", - input: { items: ["a", "b", "c"] }, - options: { arrayFormat: "repeat" }, - expected: "items=a&items=b&items=c", - }, - { - description: "should handle empty arrays", - input: { items: [] }, - expected: "", - }, - { - description: "should handle arrays with mixed types", - input: { mixed: ["string", 42, true, false] }, - expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", - }, - { - description: "should handle arrays with objects", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", - }, - { - description: "should handle arrays with objects in repeat format", - input: { users: [{ name: "John" }, { name: "Jane" }] }, - options: { arrayFormat: "repeat" }, - expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", - }, - ]; - - arrayTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Nested objects", () => { - const nestedTests: BasicTestCase[] = [ - { - description: "should handle nested objects", - input: { user: { name: "John", age: 30 } }, - expected: "user%5Bname%5D=John&user%5Bage%5D=30", - }, - { - description: "should handle deeply nested objects", - input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, - expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", - }, - { - description: "should handle empty nested objects", - input: { user: {} }, - expected: "", - }, - ]; - - nestedTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Encoding", () => { - interface EncodingTestCase { - description: string; - input: any; - options?: { encode?: boolean }; - expected: string; - } - - const encodingTests: EncodingTestCase[] = [ - { - description: "should encode by default", - input: { name: "John Doe", email: "john@example.com" }, - expected: "name=John%20Doe&email=john%40example.com", - }, - { - description: "should not encode when encode is false", - input: { name: "John Doe", email: "john@example.com" }, - options: { encode: false }, - expected: "name=John Doe&email=john@example.com", - }, - { - description: "should encode special characters in keys", - input: { "user name": "John", "email[primary]": "john@example.com" }, - expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", - }, - { - description: "should not encode special characters in keys when encode is false", - input: { "user name": "John", "email[primary]": "john@example.com" }, - options: { encode: false }, - expected: "user name=John&email[primary]=john@example.com", - }, - ]; - - encodingTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Mixed scenarios", () => { - interface MixedTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices" }; - expected: string; - } - - const mixedTests: MixedTestCase[] = [ - { - description: "should handle complex nested structures", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - expected: - "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle complex nested structures with repeat format", - input: { - filters: { - status: ["active", "pending"], - category: { - type: "electronics", - subcategories: ["phones", "laptops"], - }, - }, - sort: { field: "name", direction: "asc" }, - }, - options: { arrayFormat: "repeat" }, - expected: - "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", - }, - { - description: "should handle arrays with null/undefined values", - input: { items: ["a", null, "c", undefined, "e"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", - }, - { - description: "should handle objects with null/undefined values", - input: { name: "John", age: null, email: undefined, active: true }, - expected: "name=John&age=&active=true", - }, - ]; - - mixedTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); - - describe("Edge cases", () => { - const edgeCaseTests: BasicTestCase[] = [ - { - description: "should handle numeric keys", - input: { "0": "zero", "1": "one" }, - expected: "0=zero&1=one", - }, - { - description: "should handle boolean values in objects", - input: { enabled: true, disabled: false }, - expected: "enabled=true&disabled=false", - }, - { - description: "should handle empty strings", - input: { name: "", description: "test" }, - expected: "name=&description=test", - }, - { - description: "should handle zero values", - input: { count: 0, price: 0.0 }, - expected: "count=0&price=0", - }, - { - description: "should handle arrays with empty strings", - input: { items: ["a", "", "c"] }, - expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", - }, - ]; - - edgeCaseTests.forEach(({ description, input, expected }) => { - it(description, () => { - expect(toQueryString(input)).toBe(expected); - }); - }); - }); - - describe("Options combinations", () => { - interface OptionsTestCase { - description: string; - input: any; - options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; - expected: string; - } - - const optionsTests: OptionsTestCase[] = [ - { - description: "should respect both arrayFormat and encode options", - input: { items: ["a & b", "c & d"] }, - options: { arrayFormat: "repeat", encode: false }, - expected: "items=a & b&items=c & d", - }, - { - description: "should use default options when none provided", - input: { items: ["a", "b"] }, - expected: "items%5B0%5D=a&items%5B1%5D=b", - }, - { - description: "should merge provided options with defaults", - input: { items: ["a", "b"], name: "John Doe" }, - options: { encode: false }, - expected: "items[0]=a&items[1]=b&name=John Doe", - }, - ]; - - optionsTests.forEach(({ description, input, options, expected }) => { - it(description, () => { - expect(toQueryString(input, options)).toBe(expected); - }); - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts deleted file mode 100644 index 98b9ec0c58b9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts +++ /dev/null @@ -1,170 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContainerClient", () => { - test("getAndReturnListOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string", "string"]; - const rawResponseBody = ["string", "string"]; - server - .mockEndpoint() - .post("/container/list-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); - expect(response).toEqual(["string", "string"]); - }); - - test("getAndReturnListOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }, { string: "string" }]; - const rawResponseBody = [{ string: "string" }, { string: "string" }]; - server - .mockEndpoint() - .post("/container/list-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnListOfObjects([ - { - string: "string", - }, - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - { - string: "string", - }, - ]); - }); - - test("getAndReturnSetOfPrimitives", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = ["string"]; - const rawResponseBody = ["string"]; - server - .mockEndpoint() - .post("/container/set-of-primitives") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); - expect(response).toEqual(new Set(["string"])); - }); - - test("getAndReturnSetOfObjects", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [{ string: "string" }]; - const rawResponseBody = [{ string: "string" }]; - server - .mockEndpoint() - .post("/container/set-of-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnSetOfObjects([ - { - string: "string", - }, - ]); - expect(response).toEqual([ - { - string: "string", - }, - ]); - }); - - test("getAndReturnMapPrimToPrim", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/map-prim-to-prim") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnMapOfPrimToObject", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: { string: "string" } }; - const rawResponseBody = { string: { string: "string" } }; - server - .mockEndpoint() - .post("/container/map-prim-to-object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ - string: { - string: "string", - }, - }); - expect(response).toEqual({ - string: { - string: "string", - }, - }); - }); - - test("getAndReturnOptional", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/container/opt-objects") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.container.getAndReturnOptional({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts deleted file mode 100644 index 4bc8916f7ce5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts +++ /dev/null @@ -1,88 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ContentTypeClient", () => { - test("postJsonPatchContentType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); - - test("postJsonPatchContentWithCharsetType", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - - server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); - - const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts deleted file mode 100644 index 5770be42a097..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("EnumClient", () => { - test("getAndReturnEnum", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SUNNY"; - const rawResponseBody = "SUNNY"; - server - .mockEndpoint() - .post("/enum") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); - expect(response).toEqual("SUNNY"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts deleted file mode 100644 index b9e26c032ff9..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts +++ /dev/null @@ -1,212 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("HttpMethodsClient", () => { - test("testGet", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.httpMethods.testGet("id"); - expect(response).toEqual("string"); - }); - - test("testPost", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/http-methods") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPost({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPut", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .put("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPut("id", { - string: "string", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testPatch", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .patch("/http-methods/id") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testPatch("id", { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("testDelete", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = true; - server - .mockEndpoint() - .delete("/http-methods/id") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.httpMethods.testDelete("id"); - expect(response).toEqual(true); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts deleted file mode 100644 index 685826602e5e..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts +++ /dev/null @@ -1,448 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ObjectClient", () => { - test("getAndReturnWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/object/get-and-return-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithOptionalField({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("getAndReturnWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { string: "string" }; - const rawResponseBody = { string: "string" }; - server - .mockEndpoint() - .post("/object/get-and-return-with-required-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithRequiredField({ - string: "string", - }); - expect(response).toEqual({ - string: "string", - }); - }); - - test("getAndReturnWithMapOfMap", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { map: { map: { map: "map" } } }; - const rawResponseBody = { map: { map: { map: "map" } } }; - server - .mockEndpoint() - .post("/object/get-and-return-with-map-of-map") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnWithMapOfMap({ - map: { - map: { - map: "map", - }, - }, - }); - expect(response).toEqual({ - map: { - map: { - map: "map", - }, - }, - }); - }); - - test("getAndReturnNestedWithOptionalField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-optional-field") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredField", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); - - test("getAndReturnNestedWithRequiredFieldAsList", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = [ - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }, - ]; - const rawResponseBody = { - string: "string", - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - server - .mockEndpoint() - .post("/object/get-and-return-nested-with-required-field-list") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - { - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }, - ]); - expect(response).toEqual({ - string: "string", - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts deleted file mode 100644 index be2e7ddd6591..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("ParamsClient", () => { - test("getWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithPath("param"); - expect(response).toEqual("string"); - }); - - test("getWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.params.getWithInlinePath({ - param: "param", - }); - expect(response).toEqual("string"); - }); - - test("getWithQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithAllowMultipleQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithAllowMultipleQuery({ - query: "query", - number: 1, - }); - expect(response).toEqual(undefined); - }); - - test("getWithPathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithPathAndQuery("param", { - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("getWithInlinePathAndQuery", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); - - const response = await client.endpoints.params.getWithInlinePathAndQuery({ - param: "param", - query: "query", - }); - expect(response).toEqual(undefined); - }); - - test("modifyWithPath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithPath("param", "string"); - expect(response).toEqual("string"); - }); - - test("modifyWithInlinePath", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .put("/params/path/param") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.params.modifyWithInlinePath({ - param: "param", - body: "string", - }); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts deleted file mode 100644 index 650fc620bb1d..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PrimitiveClient", () => { - test("getAndReturnString", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - const rawResponseBody = "string"; - server - .mockEndpoint() - .post("/primitive/string") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnString("string"); - expect(response).toEqual("string"); - }); - - test("getAndReturnInt", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1; - const rawResponseBody = 1; - server - .mockEndpoint() - .post("/primitive/integer") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnInt(1); - expect(response).toEqual(1); - }); - - test("getAndReturnLong", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1000000; - const rawResponseBody = 1000000; - server - .mockEndpoint() - .post("/primitive/long") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnLong(1000000); - expect(response).toEqual(1000000); - }); - - test("getAndReturnDouble", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = 1.1; - const rawResponseBody = 1.1; - server - .mockEndpoint() - .post("/primitive/double") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDouble(1.1); - expect(response).toEqual(1.1); - }); - - test("getAndReturnBool", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = true; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/primitive/boolean") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBool(true); - expect(response).toEqual(true); - }); - - test("getAndReturnDatetime", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2024-01-15T09:30:00Z"; - const rawResponseBody = "2024-01-15T09:30:00Z"; - server - .mockEndpoint() - .post("/primitive/datetime") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); - expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); - }); - - test("getAndReturnDate", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "2023-01-15"; - const rawResponseBody = "2023-01-15"; - server - .mockEndpoint() - .post("/primitive/date") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); - expect(response).toEqual("2023-01-15"); - }); - - test("getAndReturnUUID", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; - server - .mockEndpoint() - .post("/primitive/uuid") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); - }); - - test("getAndReturnBase64", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "SGVsbG8gd29ybGQh"; - const rawResponseBody = "SGVsbG8gd29ybGQh"; - server - .mockEndpoint() - .post("/primitive/base64") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); - expect(response).toEqual("SGVsbG8gd29ybGQh"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts deleted file mode 100644 index 1481521d77b5..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("PutClient", () => { - test("add", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - errors: [ - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, - ], - }; - server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.put.add({ - id: "id", - }); - expect(response).toEqual({ - errors: [ - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - { - category: "API_ERROR", - code: "INTERNAL_SERVER_ERROR", - detail: "detail", - field: "field", - }, - ], - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts deleted file mode 100644 index 35b1405e89ca..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UnionClient", () => { - test("getAndReturnUnion", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; - const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; - server - .mockEndpoint() - .post("/union") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.union.getAndReturnUnion({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - expect(response).toEqual({ - animal: "dog", - name: "name", - likesToWoof: true, - }); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts deleted file mode 100644 index b450fbeea217..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../../src/Client"; -import { mockServerPool } from "../../mock-server/MockServerPool"; - -describe("UrlsClient", () => { - test("withMixedCase", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.endpoints.urls.withMixedCase(); - expect(response).toEqual("string"); - }); - - test("noEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/no-ending-slash") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.noEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withEndingSlash", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with-ending-slash/") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withEndingSlash(); - expect(response).toEqual("string"); - }); - - test("withUnderscores", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server - .mockEndpoint() - .get("/urls/with_underscores") - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.endpoints.urls.withUnderscores(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts deleted file mode 100644 index 61b5a64bce8f..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts +++ /dev/null @@ -1,150 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("InlinedRequestsClient", () => { - test("postWithObjectBodyandResponse (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithObjectBodyandResponse (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { - string: "string", - integer: 1, - NestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }, - }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/req-bodies/object") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.inlinedRequests.postWithObjectBodyandResponse({ - string: "string", - integer: 1, - nestedObject: { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }, - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts deleted file mode 100644 index 3317cf1a69d1..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import * as SeedExhaustive from "../../src/api/index"; -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoAuthClient", () => { - test("postWithNoAuth (1)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = true; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .jsonBody(rawResponseBody) - .build(); - - const response = await client.noAuth.postWithNoAuth({ - key: "value", - }); - expect(response).toEqual(true); - }); - - test("postWithNoAuth (2)", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = { key: "value" }; - const rawResponseBody = { message: "message" }; - server - .mockEndpoint() - .post("/no-auth") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(400) - .jsonBody(rawResponseBody) - .build(); - - await expect(async () => { - return await client.noAuth.postWithNoAuth({ - key: "value", - }); - }).rejects.toThrow(SeedExhaustive.BadRequestBody); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts deleted file mode 100644 index 8f5f6a59a512..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("NoReqBodyClient", () => { - test("getWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = { - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: "2024-01-15T09:30:00Z", - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: ["set"], - map: { "1": "map" }, - bigint: "1000000", - }; - server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.getWithNoRequestBody(); - expect(response).toEqual({ - string: "string", - integer: 1, - long: 1000000, - double: 1.1, - bool: true, - datetime: new Date("2024-01-15T09:30:00.000Z"), - date: "2023-01-15", - uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - base64: "SGVsbG8gd29ybGQh", - list: ["list", "list"], - set: new Set(["set"]), - map: { - 1: "map", - }, - bigint: "1000000", - }); - }); - - test("postWithNoRequestBody", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - - const rawResponseBody = "string"; - server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); - - const response = await client.noReqBody.postWithNoRequestBody(); - expect(response).toEqual("string"); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts deleted file mode 100644 index a128d4844ba2..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -// This file was auto-generated by Fern from our API Definition. - -import { SeedExhaustiveClient } from "../../src/Client"; -import { mockServerPool } from "../mock-server/MockServerPool"; - -describe("ReqWithHeadersClient", () => { - test("getWithCustomHeader", async () => { - const server = mockServerPool.createServer(); - const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); - const rawRequestBody = "string"; - - server - .mockEndpoint() - .post("/test-headers/custom-header") - .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") - .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") - .jsonBody(rawRequestBody) - .respondWith() - .statusCode(200) - .build(); - - const response = await client.reqWithHeaders.getWithCustomHeader({ - xTestServiceHeader: "X-TEST-SERVICE-HEADER", - xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", - body: "string", - }); - expect(response).toEqual(undefined); - }); -}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json deleted file mode 100644 index d7627675de20..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "extendedDiagnostics": true, - "strict": true, - "target": "ES6", - "moduleResolution": "node", - "esModuleInterop": true, - "skipLibCheck": true, - "declaration": true, - "outDir": "dist", - "rootDir": "src", - "baseUrl": "src", - "isolatedModules": true, - "isolatedDeclarations": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json deleted file mode 100644 index 5c11446f5984..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "CommonJS", - "outDir": "dist/cjs" - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json deleted file mode 100644 index 6ce909748b2c..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "module": "esnext", - "outDir": "dist/esm", - "verbatimModuleSyntax": true - }, - "include": ["src"], - "exclude": [] -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json deleted file mode 100644 index d77fdf00d259..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "./tsconfig.cjs.json" -} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts deleted file mode 100644 index ba2ec4f9d45a..000000000000 --- a/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig } from "vitest/config"; -export default defineConfig({ - test: { - projects: [ - { - test: { - globals: true, - name: "unit", - environment: "node", - root: "./tests", - include: ["**/*.test.{js,ts,jsx,tsx}"], - exclude: ["wire/**"], - setupFiles: ["./setup.ts"], - }, - }, - { - test: { - globals: true, - name: "wire", - environment: "node", - root: "./tests/wire", - setupFiles: ["../setup.ts", "../mock-server/setup.ts"], - }, - }, - ], - passWithNoTests: true, - }, -}); From 04b2aed6d363589ff684b9052ce39349b05840f7 Mon Sep 17 00:00:00 2001 From: Niels Swimberghe <3382717+Swimburger@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:14:55 -0500 Subject: [PATCH 71/71] seed --- .../serde-layer-zod/.fern/metadata.json | 8 + .../serde-layer-zod/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-zod/.gitignore | 3 + .../serde-layer-zod/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-zod/README.md | 241 ++ .../exhaustive/serde-layer-zod/biome.json | 74 + .../exhaustive/serde-layer-zod/package.json | 80 + .../serde-layer-zod/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-zod/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-zod/snippet.json | 544 ++++ .../serde-layer-zod/src/BaseClient.ts | 81 + .../exhaustive/serde-layer-zod/src/Client.ts | 48 + .../serde-layer-zod/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 477 +++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 172 + .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 84 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 341 ++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 523 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 535 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 563 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 84 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 85 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 223 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 111 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 93 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 130 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 90 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 37 + .../serde-layer-zod/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-zod/src/core/auth/index.ts | 5 + .../serde-layer-zod/src/core/base64.ts | 27 + .../serde-layer-zod/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../serde-layer-zod/src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-zod/src/core/headers.ts | 35 + .../serde-layer-zod/src/core/index.ts | 6 + .../serde-layer-zod/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../serde-layer-zod/src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../serde-layer-zod/src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-zod/src/core/url/index.ts | 3 + .../serde-layer-zod/src/core/url/join.ts | 79 + .../serde-layer-zod/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-zod/src/errors/index.ts | 2 + .../exhaustive/serde-layer-zod/src/exports.ts | 1 + .../exhaustive/serde-layer-zod/src/index.ts | 6 + .../src/serialization/index.ts | 1 + .../resources/endpoints/index.ts | 1 + .../client/getAndReturnListOfObjects.ts | 46 + .../client/getAndReturnListOfPrimitives.ts | 34 + .../client/getAndReturnMapOfPrimToObject.ts | 47 + .../client/getAndReturnMapPrimToPrim.ts | 36 + .../container/client/getAndReturnOptional.ts | 46 + .../client/getAndReturnSetOfObjects.ts | 46 + .../client/getAndReturnSetOfPrimitives.ts | 36 + .../resources/container/client/index.ts | 7 + .../endpoints/resources/container/index.ts | 1 + .../resources/httpMethods/client/index.ts | 2 + .../httpMethods/client/testDelete.ts | 19 + .../resources/httpMethods/client/testGet.ts | 19 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 8 + ...tAndReturnNestedWithRequiredFieldAsList.ts | 26 + .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../params/client/getWithInlinePath.ts | 19 + .../resources/params/client/getWithPath.ts | 19 + .../resources/params/client/index.ts | 4 + .../params/client/modifyWithInlinePath.ts | 34 + .../resources/params/client/modifyWithPath.ts | 34 + .../endpoints/resources/params/index.ts | 1 + .../primitive/client/getAndReturnBase64.ts | 34 + .../primitive/client/getAndReturnBool.ts | 34 + .../primitive/client/getAndReturnDate.ts | 34 + .../primitive/client/getAndReturnDatetime.ts | 34 + .../primitive/client/getAndReturnDouble.ts | 34 + .../primitive/client/getAndReturnInt.ts | 34 + .../primitive/client/getAndReturnLong.ts | 34 + .../primitive/client/getAndReturnString.ts | 34 + .../primitive/client/getAndReturnUuid.ts | 34 + .../resources/primitive/client/index.ts | 9 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/index.ts | 1 + .../resources/put/types/ErrorCategory.ts | 20 + .../resources/put/types/ErrorCode.ts | 43 + .../endpoints/resources/put/types/Error_.ts | 38 + .../resources/put/types/PutResponse.ts | 33 + .../endpoints/resources/put/types/index.ts | 4 + .../endpoints/resources/urls/client/index.ts | 4 + .../resources/urls/client/noEndingSlash.ts | 19 + .../resources/urls/client/withEndingSlash.ts | 19 + .../resources/urls/client/withMixedCase.ts | 19 + .../resources/urls/client/withUnderscores.ts | 19 + .../endpoints/resources/urls/index.ts | 1 + .../resources/generalErrors/index.ts | 1 + .../types/BadObjectRequestInfo.ts | 24 + .../resources/generalErrors/types/index.ts | 1 + .../src/serialization/resources/index.ts | 9 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 40 + .../inlinedRequests/client/requests/index.ts | 1 + .../resources/inlinedRequests/index.ts | 1 + .../resources/noAuth/client/index.ts | 1 + .../resources/noAuth/client/postWithNoAuth.ts | 19 + .../serialization/resources/noAuth/index.ts | 1 + .../resources/noReqBody/client/index.ts | 1 + .../noReqBody/client/postWithNoRequestBody.ts | 19 + .../resources/noReqBody/index.ts | 1 + .../client/getWithCustomHeader.ts | 19 + .../resources/reqWithHeaders/client/index.ts | 1 + .../resources/reqWithHeaders/index.ts | 1 + .../serialization/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 24 + .../types/resources/docs/types/index.ts | 1 + .../resources/types/resources/enum/index.ts | 1 + .../resources/enum/types/WeatherReport.ts | 20 + .../types/resources/enum/types/index.ts | 1 + .../resources/types/resources/index.ts | 8 + .../resources/types/resources/object/index.ts | 1 + .../resources/object/types/DoubleOptional.ts | 33 + .../types/NestedObjectWithOptionalField.ts | 44 + .../types/NestedObjectWithRequiredField.ts | 39 + .../object/types/ObjectWithMapOfMap.ts | 24 + .../object/types/ObjectWithOptionalField.ts | 74 + .../object/types/ObjectWithRequiredField.ts | 25 + .../resources/object/types/OptionalAlias.ts | 20 + .../types/resources/object/types/index.ts | 7 + .../resources/types/resources/union/index.ts | 1 + .../types/resources/union/types/Animal.ts | 35 + .../types/resources/union/types/Cat.ts | 26 + .../types/resources/union/types/Dog.ts | 26 + .../types/resources/union/types/index.ts | 3 + .../exhaustive/serde-layer-zod/src/version.ts | 1 + .../serde-layer-zod/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../exhaustive/serde-layer-zod/tests/setup.ts | 80 + .../serde-layer-zod/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../serde-layer-zod/tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/url/join.test.ts | 284 ++ .../serde-layer-zod/tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-zod/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../serde-layer-zod/tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-zod/tsconfig.base.json | 18 + .../serde-layer-zod/tsconfig.cjs.json | 9 + .../serde-layer-zod/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-zod/tsconfig.json | 3 + .../serde-layer-zod/vitest.config.mts | 28 + .../serde-layer-zurg/.fern/metadata.json | 8 + .../serde-layer-zurg/.github/workflows/ci.yml | 78 + .../exhaustive/serde-layer-zurg/.gitignore | 3 + .../serde-layer-zurg/CONTRIBUTING.md | 133 + .../exhaustive/serde-layer-zurg/README.md | 241 ++ .../exhaustive/serde-layer-zurg/biome.json | 74 + .../exhaustive/serde-layer-zurg/package.json | 78 + .../serde-layer-zurg/pnpm-workspace.yaml | 1 + .../exhaustive/serde-layer-zurg/reference.md | 2761 +++++++++++++++++ .../scripts/rename-to-esm-files.js | 123 + .../exhaustive/serde-layer-zurg/snippet.json | 544 ++++ .../serde-layer-zurg/src/BaseClient.ts | 81 + .../exhaustive/serde-layer-zurg/src/Client.ts | 48 + .../serde-layer-zurg/src/api/index.ts | 1 + .../api/resources/endpoints/client/Client.ts | 76 + .../api/resources/endpoints/client/index.ts | 1 + .../src/api/resources/endpoints/index.ts | 2 + .../resources/container/client/Client.ts | 543 ++++ .../resources/container/client/index.ts | 1 + .../endpoints/resources/container/index.ts | 1 + .../resources/contentType/client/Client.ts | 178 ++ .../resources/contentType/client/index.ts | 1 + .../endpoints/resources/contentType/index.ts | 1 + .../endpoints/resources/enum/client/Client.ts | 93 + .../endpoints/resources/enum/client/index.ts | 1 + .../endpoints/resources/enum/index.ts | 1 + .../resources/httpMethods/client/Client.ts | 380 +++ .../resources/httpMethods/client/index.ts | 1 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 13 + .../resources/object/client/Client.ts | 577 ++++ .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../resources/params/client/Client.ts | 565 ++++ .../resources/params/client/index.ts | 1 + .../client/requests/GetWithInlinePath.ts | 11 + .../requests/GetWithInlinePathAndQuery.ts | 13 + .../client/requests/GetWithMultipleQuery.ts | 13 + .../client/requests/GetWithPathAndQuery.ts | 11 + .../params/client/requests/GetWithQuery.ts | 13 + .../requests/ModifyResourceAtInlinedPath.ts | 13 + .../resources/params/client/requests/index.ts | 6 + .../endpoints/resources/params/index.ts | 1 + .../resources/primitive/client/Client.ts | 644 ++++ .../resources/primitive/client/index.ts | 1 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/client/Client.ts | 90 + .../endpoints/resources/put/client/index.ts | 1 + .../put/client/requests/PutRequest.ts | 11 + .../resources/put/client/requests/index.ts | 1 + .../endpoints/resources/put/index.ts | 2 + .../resources/put/types/ErrorCategory.ts | 8 + .../resources/put/types/ErrorCode.ts | 16 + .../endpoints/resources/put/types/Error_.ts | 10 + .../resources/put/types/PutResponse.ts | 7 + .../endpoints/resources/put/types/index.ts | 4 + .../resources/union/client/Client.ts | 97 + .../endpoints/resources/union/client/index.ts | 1 + .../endpoints/resources/union/index.ts | 1 + .../endpoints/resources/urls/client/Client.ts | 247 ++ .../endpoints/resources/urls/client/index.ts | 1 + .../endpoints/resources/urls/index.ts | 1 + .../generalErrors/errors/BadRequestBody.ts | 22 + .../resources/generalErrors/errors/index.ts | 1 + .../src/api/resources/generalErrors/index.ts | 2 + .../types/BadObjectRequestInfo.ts | 5 + .../resources/generalErrors/types/index.ts | 1 + .../src/api/resources/index.ts | 11 + .../inlinedRequests/client/Client.ts | 126 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 33 + .../inlinedRequests/client/requests/index.ts | 1 + .../api/resources/inlinedRequests/index.ts | 1 + .../src/api/resources/noAuth/client/Client.ts | 105 + .../src/api/resources/noAuth/client/index.ts | 1 + .../src/api/resources/noAuth/index.ts | 1 + .../api/resources/noReqBody/client/Client.ts | 142 + .../api/resources/noReqBody/client/index.ts | 1 + .../src/api/resources/noReqBody/index.ts | 1 + .../resources/reqWithHeaders/client/Client.ts | 93 + .../resources/reqWithHeaders/client/index.ts | 1 + .../client/requests/ReqWithHeaders.ts | 15 + .../reqWithHeaders/client/requests/index.ts | 1 + .../src/api/resources/reqWithHeaders/index.ts | 1 + .../src/api/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 66 + .../types/resources/docs/types/index.ts | 1 + .../enum/errors/ErrorWithEnumBody.ts | 22 + .../types/resources/enum/errors/index.ts | 1 + .../resources/types/resources/enum/index.ts | 2 + .../resources/enum/types/WeatherReport.ts | 9 + .../types/resources/enum/types/index.ts | 1 + .../api/resources/types/resources/index.ts | 11 + .../NestedObjectWithOptionalFieldError.ts | 22 + .../NestedObjectWithRequiredFieldError.ts | 22 + .../errors/ObjectWithOptionalFieldError.ts | 22 + .../errors/ObjectWithRequiredFieldError.ts | 22 + .../types/resources/object/errors/index.ts | 4 + .../resources/types/resources/object/index.ts | 2 + .../resources/object/types/DoubleOptional.ts | 7 + .../types/NestedObjectWithOptionalField.ts | 8 + .../types/NestedObjectWithRequiredField.ts | 8 + .../object/types/ObjectWithMapOfMap.ts | 5 + .../object/types/ObjectWithOptionalField.ts | 18 + .../object/types/ObjectWithRequiredField.ts | 5 + .../resources/object/types/OptionalAlias.ts | 3 + .../types/resources/object/types/index.ts | 7 + .../union/errors/ErrorWithUnionBody.ts | 22 + .../types/resources/union/errors/index.ts | 1 + .../resources/types/resources/union/index.ts | 2 + .../types/resources/union/types/Animal.ts | 15 + .../types/resources/union/types/Cat.ts | 6 + .../types/resources/union/types/Dog.ts | 6 + .../types/resources/union/types/index.ts | 3 + .../src/auth/BearerAuthProvider.ts | 37 + .../serde-layer-zurg/src/auth/index.ts | 1 + .../src/core/auth/AuthProvider.ts | 6 + .../src/core/auth/AuthRequest.ts | 9 + .../src/core/auth/BasicAuth.ts | 32 + .../src/core/auth/BearerToken.ts | 20 + .../src/core/auth/NoOpAuthProvider.ts | 8 + .../serde-layer-zurg/src/core/auth/index.ts | 5 + .../serde-layer-zurg/src/core/base64.ts | 27 + .../serde-layer-zurg/src/core/exports.ts | 1 + .../src/core/fetcher/APIResponse.ts | 23 + .../src/core/fetcher/BinaryResponse.ts | 34 + .../src/core/fetcher/EndpointMetadata.ts | 13 + .../src/core/fetcher/EndpointSupplier.ts | 14 + .../src/core/fetcher/Fetcher.ts | 391 +++ .../src/core/fetcher/Headers.ts | 93 + .../src/core/fetcher/HttpResponsePromise.ts | 116 + .../src/core/fetcher/RawResponse.ts | 61 + .../src/core/fetcher/Supplier.ts | 11 + .../src/core/fetcher/createRequestUrl.ts | 6 + .../src/core/fetcher/getErrorResponseBody.ts | 33 + .../src/core/fetcher/getFetchFn.ts | 3 + .../src/core/fetcher/getHeader.ts | 8 + .../src/core/fetcher/getRequestBody.ts | 20 + .../src/core/fetcher/getResponseBody.ts | 58 + .../src/core/fetcher/index.ts | 11 + .../src/core/fetcher/makeRequest.ts | 42 + .../src/core/fetcher/requestWithRetries.ts | 64 + .../src/core/fetcher/signals.ts | 26 + .../serde-layer-zurg/src/core/headers.ts | 35 + .../serde-layer-zurg/src/core/index.ts | 7 + .../serde-layer-zurg/src/core/json.ts | 27 + .../src/core/logging/exports.ts | 19 + .../src/core/logging/index.ts | 1 + .../src/core/logging/logger.ts | 203 ++ .../src/core/runtime/index.ts | 1 + .../src/core/runtime/runtime.ts | 134 + .../src/core/schemas/Schema.ts | 103 + .../core/schemas/builders/bigint/bigint.ts | 55 + .../src/core/schemas/builders/bigint/index.ts | 1 + .../src/core/schemas/builders/date/date.ts | 65 + .../src/core/schemas/builders/date/index.ts | 1 + .../src/core/schemas/builders/enum/enum.ts | 43 + .../src/core/schemas/builders/enum/index.ts | 1 + .../src/core/schemas/builders/index.ts | 14 + .../src/core/schemas/builders/lazy/index.ts | 3 + .../src/core/schemas/builders/lazy/lazy.ts | 32 + .../core/schemas/builders/lazy/lazyObject.ts | 20 + .../src/core/schemas/builders/list/index.ts | 1 + .../src/core/schemas/builders/list/list.ts | 73 + .../builders/literals/booleanLiteral.ts | 29 + .../core/schemas/builders/literals/index.ts | 2 + .../builders/literals/stringLiteral.ts | 29 + .../object-like/getObjectLikeUtils.ts | 79 + .../schemas/builders/object-like/index.ts | 2 + .../schemas/builders/object-like/types.ts | 13 + .../src/core/schemas/builders/object/index.ts | 22 + .../core/schemas/builders/object/object.ts | 382 +++ .../object/objectWithoutOptionalProperties.ts | 23 + .../core/schemas/builders/object/property.ts | 23 + .../src/core/schemas/builders/object/types.ts | 73 + .../core/schemas/builders/primitives/any.ts | 7 + .../schemas/builders/primitives/boolean.ts | 25 + .../core/schemas/builders/primitives/index.ts | 6 + .../core/schemas/builders/primitives/never.ts | 15 + .../schemas/builders/primitives/number.ts | 25 + .../schemas/builders/primitives/string.ts | 25 + .../schemas/builders/primitives/unknown.ts | 7 + .../src/core/schemas/builders/record/index.ts | 2 + .../core/schemas/builders/record/record.ts | 129 + .../src/core/schemas/builders/record/types.ts | 17 + .../builders/schema-utils/JsonError.ts | 9 + .../builders/schema-utils/ParseError.ts | 9 + .../builders/schema-utils/getSchemaUtils.ts | 181 ++ .../schemas/builders/schema-utils/index.ts | 4 + .../schema-utils/stringifyValidationErrors.ts | 8 + .../src/core/schemas/builders/set/index.ts | 1 + .../src/core/schemas/builders/set/set.ts | 43 + .../builders/undiscriminated-union/index.ts | 6 + .../builders/undiscriminated-union/types.ts | 10 + .../undiscriminatedUnion.ts | 67 + .../schemas/builders/union/discriminant.ts | 14 + .../src/core/schemas/builders/union/index.ts | 10 + .../src/core/schemas/builders/union/types.ts | 26 + .../src/core/schemas/builders/union/union.ts | 176 ++ .../src/core/schemas/index.ts | 2 + .../src/core/schemas/utils/MaybePromise.ts | 1 + .../addQuestionMarksToNullableProperties.ts | 9 + .../utils/createIdentitySchemaCreator.ts | 21 + .../src/core/schemas/utils/entries.ts | 3 + .../src/core/schemas/utils/filterObject.ts | 13 + .../utils/getErrorMessageForIncorrectType.ts | 25 + .../src/core/schemas/utils/isPlainObject.ts | 17 + .../src/core/schemas/utils/keys.ts | 3 + .../core/schemas/utils/maybeSkipValidation.ts | 38 + .../src/core/schemas/utils/partition.ts | 12 + .../src/core/url/encodePathParam.ts | 18 + .../serde-layer-zurg/src/core/url/index.ts | 3 + .../serde-layer-zurg/src/core/url/join.ts | 79 + .../serde-layer-zurg/src/core/url/qs.ts | 74 + .../src/errors/SeedExhaustiveError.ts | 58 + .../src/errors/SeedExhaustiveTimeoutError.ts | 13 + .../src/errors/handleNonStatusCodeError.ts | 37 + .../serde-layer-zurg/src/errors/index.ts | 2 + .../serde-layer-zurg/src/exports.ts | 1 + .../exhaustive/serde-layer-zurg/src/index.ts | 6 + .../src/serialization/index.ts | 1 + .../resources/endpoints/index.ts | 1 + .../client/getAndReturnListOfObjects.ts | 24 + .../client/getAndReturnListOfPrimitives.ts | 22 + .../client/getAndReturnMapOfPrimToObject.ts | 24 + .../client/getAndReturnMapPrimToPrim.ts | 22 + .../container/client/getAndReturnOptional.ts | 24 + .../client/getAndReturnSetOfObjects.ts | 24 + .../client/getAndReturnSetOfPrimitives.ts | 22 + .../resources/container/client/index.ts | 7 + .../endpoints/resources/container/index.ts | 1 + .../resources/httpMethods/client/index.ts | 2 + .../httpMethods/client/testDelete.ts | 11 + .../resources/httpMethods/client/testGet.ts | 11 + .../endpoints/resources/httpMethods/index.ts | 1 + .../resources/endpoints/resources/index.ts | 8 + ...tAndReturnNestedWithRequiredFieldAsList.ts | 15 + .../resources/object/client/index.ts | 1 + .../endpoints/resources/object/index.ts | 1 + .../params/client/getWithInlinePath.ts | 11 + .../resources/params/client/getWithPath.ts | 11 + .../resources/params/client/index.ts | 4 + .../params/client/modifyWithInlinePath.ts | 20 + .../resources/params/client/modifyWithPath.ts | 18 + .../endpoints/resources/params/index.ts | 1 + .../primitive/client/getAndReturnBase64.ts | 22 + .../primitive/client/getAndReturnBool.ts | 20 + .../primitive/client/getAndReturnDate.ts | 20 + .../primitive/client/getAndReturnDatetime.ts | 22 + .../primitive/client/getAndReturnDouble.ts | 22 + .../primitive/client/getAndReturnInt.ts | 18 + .../primitive/client/getAndReturnLong.ts | 20 + .../primitive/client/getAndReturnString.ts | 22 + .../primitive/client/getAndReturnUuid.ts | 20 + .../resources/primitive/client/index.ts | 9 + .../endpoints/resources/primitive/index.ts | 1 + .../endpoints/resources/put/index.ts | 1 + .../resources/put/types/ErrorCategory.ts | 14 + .../resources/put/types/ErrorCode.ts | 37 + .../endpoints/resources/put/types/Error_.ts | 26 + .../resources/put/types/PutResponse.ts | 19 + .../endpoints/resources/put/types/index.ts | 4 + .../endpoints/resources/urls/client/index.ts | 4 + .../resources/urls/client/noEndingSlash.ts | 11 + .../resources/urls/client/withEndingSlash.ts | 11 + .../resources/urls/client/withMixedCase.ts | 11 + .../resources/urls/client/withUnderscores.ts | 11 + .../endpoints/resources/urls/index.ts | 1 + .../resources/generalErrors/index.ts | 1 + .../types/BadObjectRequestInfo.ts | 18 + .../resources/generalErrors/types/index.ts | 1 + .../src/serialization/resources/index.ts | 9 + .../resources/inlinedRequests/client/index.ts | 1 + .../client/requests/PostWithObjectBody.ts | 23 + .../inlinedRequests/client/requests/index.ts | 1 + .../resources/inlinedRequests/index.ts | 1 + .../resources/noAuth/client/index.ts | 1 + .../resources/noAuth/client/postWithNoAuth.ts | 11 + .../serialization/resources/noAuth/index.ts | 1 + .../resources/noReqBody/client/index.ts | 1 + .../noReqBody/client/postWithNoRequestBody.ts | 11 + .../resources/noReqBody/index.ts | 1 + .../client/getWithCustomHeader.ts | 11 + .../resources/reqWithHeaders/client/index.ts | 1 + .../resources/reqWithHeaders/index.ts | 1 + .../serialization/resources/types/index.ts | 1 + .../resources/types/resources/docs/index.ts | 1 + .../resources/docs/types/ObjectWithDocs.ts | 18 + .../types/resources/docs/types/index.ts | 1 + .../resources/types/resources/enum/index.ts | 1 + .../resources/enum/types/WeatherReport.ts | 14 + .../types/resources/enum/types/index.ts | 1 + .../resources/types/resources/index.ts | 8 + .../resources/types/resources/object/index.ts | 1 + .../resources/object/types/DoubleOptional.ts | 19 + .../types/NestedObjectWithOptionalField.ts | 21 + .../types/NestedObjectWithRequiredField.ts | 21 + .../object/types/ObjectWithMapOfMap.ts | 21 + .../object/types/ObjectWithOptionalField.ts | 42 + .../object/types/ObjectWithRequiredField.ts | 18 + .../resources/object/types/OptionalAlias.ts | 14 + .../types/resources/object/types/index.ts | 7 + .../resources/types/resources/union/index.ts | 1 + .../types/resources/union/types/Animal.ts | 30 + .../types/resources/union/types/Cat.ts | 18 + .../types/resources/union/types/Dog.ts | 18 + .../types/resources/union/types/index.ts | 3 + .../serde-layer-zurg/src/version.ts | 1 + .../serde-layer-zurg/tests/custom.test.ts | 13 + .../tests/mock-server/MockServer.ts | 29 + .../tests/mock-server/MockServerPool.ts | 106 + .../tests/mock-server/mockEndpointBuilder.ts | 227 ++ .../tests/mock-server/randomBaseUrl.ts | 4 + .../tests/mock-server/setup.ts | 10 + .../tests/mock-server/withFormUrlEncoded.ts | 80 + .../tests/mock-server/withHeaders.ts | 70 + .../tests/mock-server/withJson.ts | 158 + .../serde-layer-zurg/tests/setup.ts | 80 + .../serde-layer-zurg/tests/tsconfig.json | 11 + .../tests/unit/auth/BasicAuth.test.ts | 92 + .../tests/unit/auth/BearerToken.test.ts | 14 + .../tests/unit/base64.test.ts | 53 + .../tests/unit/fetcher/Fetcher.test.ts | 261 ++ .../unit/fetcher/HttpResponsePromise.test.ts | 143 + .../tests/unit/fetcher/RawResponse.test.ts | 34 + .../unit/fetcher/createRequestUrl.test.ts | 163 + .../tests/unit/fetcher/getRequestBody.test.ts | 129 + .../unit/fetcher/getResponseBody.test.ts | 97 + .../tests/unit/fetcher/logging.test.ts | 517 +++ .../tests/unit/fetcher/makeRequest.test.ts | 54 + .../tests/unit/fetcher/redacting.test.ts | 1115 +++++++ .../unit/fetcher/requestWithRetries.test.ts | 230 ++ .../tests/unit/fetcher/signals.test.ts | 69 + .../tests/unit/fetcher/test-file.txt | 1 + .../tests/unit/logging/logger.test.ts | 454 +++ .../tests/unit/schemas/bigint/bigint.test.ts | 46 + .../tests/unit/schemas/date/date.test.ts | 31 + .../tests/unit/schemas/enum/enum.test.ts | 30 + .../tests/unit/schemas/lazy/lazy.test.ts | 57 + .../unit/schemas/lazy/lazyObject.test.ts | 18 + .../tests/unit/schemas/lazy/recursive/a.ts | 7 + .../tests/unit/schemas/lazy/recursive/b.ts | 8 + .../tests/unit/schemas/list/list.test.ts | 41 + .../schemas/literals/stringLiteral.test.ts | 21 + .../object-like/withParsedProperties.test.ts | 57 + .../tests/unit/schemas/object/extend.test.ts | 89 + .../tests/unit/schemas/object/object.test.ts | 255 ++ .../objectWithoutOptionalProperties.test.ts | 21 + .../unit/schemas/object/passthrough.test.ts | 87 + .../tests/unit/schemas/primitives/any.test.ts | 6 + .../unit/schemas/primitives/boolean.test.ts | 14 + .../unit/schemas/primitives/never.test.ts | 54 + .../unit/schemas/primitives/number.test.ts | 14 + .../unit/schemas/primitives/string.test.ts | 14 + .../unit/schemas/primitives/unknown.test.ts | 6 + .../tests/unit/schemas/record/record.test.ts | 34 + .../schema-utils/getSchemaUtils.test.ts | 83 + .../tests/unit/schemas/schema.test.ts | 78 + .../tests/unit/schemas/set/set.test.ts | 48 + .../tests/unit/schemas/skipValidation.test.ts | 44 + .../undiscriminatedUnion.test.ts | 44 + .../tests/unit/schemas/union/union.test.ts | 113 + .../tests/unit/schemas/utils/itSchema.ts | 78 + .../tests/unit/schemas/utils/itValidate.ts | 56 + .../tests/unit/url/join.test.ts | 284 ++ .../tests/unit/url/qs.test.ts | 278 ++ .../serde-layer-zurg/tests/wire/.gitkeep | 0 .../tests/wire/endpoints/container.test.ts | 170 + .../tests/wire/endpoints/contentType.test.ts | 88 + .../tests/wire/endpoints/enum.test.ts | 24 + .../tests/wire/endpoints/httpMethods.test.ts | 212 ++ .../tests/wire/endpoints/object.test.ts | 448 +++ .../tests/wire/endpoints/params.test.ts | 120 + .../tests/wire/endpoints/primitive.test.ts | 168 + .../tests/wire/endpoints/put.test.ts | 39 + .../tests/wire/endpoints/union.test.ts | 32 + .../tests/wire/endpoints/urls.test.ts | 68 + .../tests/wire/inlinedRequests.test.ts | 150 + .../tests/wire/noAuth.test.ts | 48 + .../tests/wire/noReqBody.test.ts | 58 + .../tests/wire/reqWithHeaders.test.ts | 29 + .../serde-layer-zurg/tsconfig.base.json | 18 + .../serde-layer-zurg/tsconfig.cjs.json | 9 + .../serde-layer-zurg/tsconfig.esm.json | 10 + .../exhaustive/serde-layer-zurg/tsconfig.json | 3 + .../serde-layer-zurg/vitest.config.mts | 28 + seed/ts-sdk/seed.yml | 3 - 687 files changed, 39966 insertions(+), 3 deletions(-) create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/README.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/package.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json create mode 100644 seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json new file mode 100644 index 000000000000..4a881bff00a8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "zod" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/README.md b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +

+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/package.json b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json new file mode 100644 index 000000000000..20397bfc4323 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/package.json @@ -0,0 +1,80 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./serialization": { + "types": "./dist/cjs/serialization/index.d.ts", + "import": { + "types": "./dist/esm/serialization/index.d.mts", + "default": "./dist/esm/serialization/index.mjs" + }, + "require": { + "types": "./dist/cjs/serialization/index.d.ts", + "default": "./dist/cjs/serialization/index.js" + }, + "default": "./dist/cjs/serialization/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": { + "zod": "^3.23.0" + }, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md new file mode 100644 index 000000000000..b571afcab9fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Set` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Date` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json new file mode 100644 index 000000000000..875b76c4bb57 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts new file mode 100644 index 000000000000..3ab4e838f800 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/BaseClient.ts @@ -0,0 +1,81 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export type BaseClientOptions = { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} & BearerAuthProvider.AuthOptions; + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts new file mode 100644 index 000000000000..370640f5862d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..78dcad40a3fa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export type Options = BaseClientOptions; +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..feb97f99da76 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,477 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response._schema.parse( + _response.body, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfObjects.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfObjects.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {Set} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) + */ + public getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response._schema.parse( + _response.body, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfObjects.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response._schema.parse( + _response.body, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: + request != null + ? serializers.endpoints.container.getAndReturnOptional.Request.json(request) + : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnOptional.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..dcd685cf5028 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,172 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..b81bf663dcc9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,84 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.WeatherReport.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.WeatherReport._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..e4673da90729 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,341 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testGet.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testDelete.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..804a77a90ac3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,523 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithRequiredField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithMapOfMap.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithMapOfMap._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithOptionalField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithRequiredField.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..84f66386db7f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,535 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithPath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithInlinePath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithPath.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithPath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithInlinePath.Request.json(_body), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithInlinePath.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..e12ee83a612e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,563 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace PrimitiveClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnString.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnString.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnInt.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnInt.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnLong.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnLong.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDouble.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDouble.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBool.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBool.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {Date} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) + */ + public getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDatetime.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDatetime.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDate.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDate.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnUuid.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnUuid.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBase64.Request.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBase64.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..d040de02b8ac --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,84 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.PutResponse._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..dbcfd29768a0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,85 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.Animal.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: serializers.types.Animal._schema.parse(_response.body), rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..9bf501ea16fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,223 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace UrlsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withMixedCase.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.noEndingSlash.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withEndingSlash.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withUnderscores.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..40b1e05011e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,111 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.PostWithObjectBody.json(request), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo._schema.parse(_response.error.body), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..15d3f75bc67d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..08508f47c0f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noAuth.postWithNoAuth.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo._schema.parse(_response.error.body), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..799f6fe6cc00 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,130 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noReqBody.postWithNoRequestBody.Response._schema.parse(_response.body), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..0b6c1b11327c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,90 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.reqWithHeaders.getWithCustomHeader.Request.json(_body), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..b7fce3790bf5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + xTestServiceHeader: string; + xTestEndpointHeader: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..324bb2e73908 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..322dcfbd5c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..2e6b3811b575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: Date; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: Set; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..95ada392f8de --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/BearerAuthProvider.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface AuthOptions { + token?: core.Supplier; + } + + export interface Options extends AuthOptions {} +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier | undefined; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts new file mode 100644 index 000000000000..92290bfadcac --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/index.ts @@ -0,0 +1,6 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts new file mode 100644 index 000000000000..9f0bdd34e0d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/index.ts @@ -0,0 +1,6 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; +export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts new file mode 100644 index 000000000000..3e5dc038a0ae --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -0,0 +1,46 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = z.array(ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, +}; + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +const _Response_Schema = z.array(ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, +}; + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts new file mode 100644 index 000000000000..d5c3cd1ae608 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.array(z.string()); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string[]; + json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string[], + json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string[]; +} + +const _Response_Schema = z.array(z.string()); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string[]; + json: (parsed: string[]) => serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string[], + json: (parsed: string[]) => parsed as serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts new file mode 100644 index 000000000000..000bdb1a9f9a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -0,0 +1,47 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = z.record(z.string(), ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: ( + parsed: Record, + ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, + json: (parsed: Record) => + Object.fromEntries( + Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), + ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, +}; + +export declare namespace Request { + export type Raw = Record; +} + +const _Response_Schema = z.record(z.string(), ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: ( + parsed: Record, + ) => serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => + _Response_Schema.parse(raw) as Record, + json: (parsed: Record) => + Object.fromEntries( + Object.entries(parsed).map(([k, v]) => [k, ObjectWithRequiredField.json(v)]), + ) as serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, +}; + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts new file mode 100644 index 000000000000..f5db8ef1efae --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -0,0 +1,36 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.record(z.string(), z.string()); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Record, + json: (parsed: Record) => + parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, +}; + +export declare namespace Request { + export type Raw = Record; +} + +const _Response_Schema = z.record(z.string(), z.string()); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Record; + json: (parsed: Record) => serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Record, + json: (parsed: Record) => + parsed as serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, +}; + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts new file mode 100644 index 000000000000..fb36dd017dc2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -0,0 +1,46 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = ObjectWithRequiredField._schema.optional(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, + ) => serializers.endpoints.container.getAndReturnOptional.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => + parsed != null + ? ObjectWithRequiredField.json(parsed) + : (parsed as serializers.endpoints.container.getAndReturnOptional.Request.Raw), +}; + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} + +const _Response_Schema = ObjectWithRequiredField._schema.optional(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField | undefined; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined, + ) => serializers.endpoints.container.getAndReturnOptional.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField | undefined, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField | undefined) => + parsed != null + ? ObjectWithRequiredField.json(parsed) + : (parsed as serializers.endpoints.container.getAndReturnOptional.Response.Raw), +}; + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts new file mode 100644 index 000000000000..0c85a32c4a09 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -0,0 +1,46 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +const _Request_Schema = z.array(ObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, +}; + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +const _Response_Schema = z.array(ObjectWithRequiredField._schema); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.ObjectWithRequiredField[], + ) => serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField[]) => + parsed.map((item) => + ObjectWithRequiredField.json(item), + ) as serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, +}; + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts new file mode 100644 index 000000000000..f80628d1136e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -0,0 +1,36 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.array(z.string()).transform((arr) => new Set(arr)); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Set; + json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Set, + json: (parsed: Set) => + Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string[]; +} + +const _Response_Schema = z.array(z.string()).transform((arr) => new Set(arr)); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Set; + json: (parsed: Set) => serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Set, + json: (parsed: Set) => + Array.from(parsed) as serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..1972f5b270f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1,7 @@ +export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; +export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; +export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; +export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; +export * as getAndReturnOptional from "./getAndReturnOptional.js"; +export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; +export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..e053119b972c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1,2 @@ +export * as testDelete from "./testDelete.js"; +export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts new file mode 100644 index 000000000000..f770bb3d0434 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.httpMethods.testDelete.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.httpMethods.testDelete.Response.Raw, +}; + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts new file mode 100644 index 000000000000..ee29c6d64e90 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.httpMethods.testGet.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.httpMethods.testGet.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..cd7e640937da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/index.ts @@ -0,0 +1,8 @@ +export * as container from "./container/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts new file mode 100644 index 000000000000..2ffc5ec115c4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; + +const _Request_Schema = z.array(NestedObjectWithRequiredField._schema); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField[]; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithRequiredField[], + ) => serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField[], + json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField[]) => + parsed.map((item) => + NestedObjectWithRequiredField.json(item), + ) as serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, +}; + +export declare namespace Request { + export type Raw = NestedObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..d00c4c582910 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts new file mode 100644 index 000000000000..62d66628879c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.getWithInlinePath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.getWithInlinePath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts new file mode 100644 index 000000000000..28e0a88b1335 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.getWithPath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.getWithPath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..b30603cae602 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1,4 @@ +export * as getWithInlinePath from "./getWithInlinePath.js"; +export * as getWithPath from "./getWithPath.js"; +export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; +export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts new file mode 100644 index 000000000000..920948641520 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithInlinePath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithInlinePath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts new file mode 100644 index 000000000000..f2004c062f3b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.params.modifyWithPath.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.params.modifyWithPath.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts new file mode 100644 index 000000000000..7761ce306fe3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnBase64.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts new file mode 100644 index 000000000000..ea9575e1ce1e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.boolean(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Request.Raw, +}; + +export declare namespace Request { + export type Raw = boolean; +} + +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.endpoints.primitive.getAndReturnBool.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.endpoints.primitive.getAndReturnBool.Response.Raw, +}; + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts new file mode 100644 index 000000000000..52cc217d53a2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnDate.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnDate.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts new file mode 100644 index 000000000000..337a002320dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string().transform((s) => new Date(s)); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Date; + json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as Date, + json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string().transform((s) => new Date(s)); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => Date; + json: (parsed: Date) => serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as Date, + json: (parsed: Date) => parsed.toISOString() as serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts new file mode 100644 index 000000000000..b04a1153d28b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, +}; + +export declare namespace Request { + export type Raw = number; +} + +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnDouble.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, +}; + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts new file mode 100644 index 000000000000..40b6b5b97418 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Request.Raw, +}; + +export declare namespace Request { + export type Raw = number; +} + +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnInt.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnInt.Response.Raw, +}; + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts new file mode 100644 index 000000000000..0fc1f2cdff59 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.number(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Request.Raw, +}; + +export declare namespace Request { + export type Raw = number; +} + +const _Response_Schema = z.number(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => number; + json: (parsed: number) => serializers.endpoints.primitive.getAndReturnLong.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as number, + json: (parsed: number) => parsed as serializers.endpoints.primitive.getAndReturnLong.Response.Raw, +}; + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts new file mode 100644 index 000000000000..ec9d5995de47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnString.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnString.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts new file mode 100644 index 000000000000..7f5c79800271 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -0,0 +1,34 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.primitive.getAndReturnUuid.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..9805ab86b129 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1,9 @@ +export * as getAndReturnBase64 from "./getAndReturnBase64.js"; +export * as getAndReturnBool from "./getAndReturnBool.js"; +export * as getAndReturnDate from "./getAndReturnDate.js"; +export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; +export * as getAndReturnDouble from "./getAndReturnDouble.js"; +export * as getAndReturnInt from "./getAndReturnInt.js"; +export * as getAndReturnLong from "./getAndReturnLong.js"; +export * as getAndReturnString from "./getAndReturnString.js"; +export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..fda956fe3da3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ErrorCategory_Schema = z.enum(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); +export const ErrorCategory: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCategory; + json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => serializers.endpoints.ErrorCategory.Raw; +} = { + _schema: _ErrorCategory_Schema, + parse: (raw: unknown) => _ErrorCategory_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCategory, + json: (parsed: SeedExhaustive.endpoints.ErrorCategory) => parsed as serializers.endpoints.ErrorCategory.Raw, +}; + +export declare namespace ErrorCategory { + export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..0daa10ba1c93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,43 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ErrorCode_Schema = z.enum([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); +export const ErrorCode: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.ErrorCode; + json: (parsed: SeedExhaustive.endpoints.ErrorCode) => serializers.endpoints.ErrorCode.Raw; +} = { + _schema: _ErrorCode_Schema, + parse: (raw: unknown) => _ErrorCode_Schema.parse(raw) as SeedExhaustive.endpoints.ErrorCode, + json: (parsed: SeedExhaustive.endpoints.ErrorCode) => parsed as serializers.endpoints.ErrorCode.Raw, +}; + +export declare namespace ErrorCode { + export type Raw = + | "INTERNAL_SERVER_ERROR" + | "UNAUTHORIZED" + | "FORBIDDEN" + | "BAD_REQUEST" + | "CONFLICT" + | "GONE" + | "UNPROCESSABLE_ENTITY" + | "NOT_IMPLEMENTED" + | "BAD_GATEWAY" + | "SERVICE_UNAVAILABLE" + | "Unknown"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..917889e06380 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,38 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ErrorCategory } from "./ErrorCategory.js"; +import { ErrorCode } from "./ErrorCode.js"; + +const _Error__Schema = z.object({ + category: ErrorCategory._schema, + code: ErrorCode._schema, + detail: z.string().optional(), + field: z.string().optional(), +}); +export const Error_: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.Error_; + json: (parsed: SeedExhaustive.endpoints.Error_) => serializers.endpoints.Error_.Raw; +} = { + _schema: _Error__Schema, + parse: (raw: unknown) => _Error__Schema.parse(raw) as SeedExhaustive.endpoints.Error_, + json: (parsed: SeedExhaustive.endpoints.Error_) => + ({ + category: ErrorCategory.json(parsed.category), + code: ErrorCode.json(parsed.code), + detail: parsed.detail, + field: parsed.field, + }) as serializers.endpoints.Error_.Raw, +}; + +export declare namespace Error_ { + export interface Raw { + category: ErrorCategory.Raw; + code: ErrorCode.Raw; + detail?: string | null; + field?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..520e6cfb62b7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Error_ } from "./Error_.js"; + +const _PutResponse_Schema = z.object({ + errors: z.array(Error_._schema).optional(), +}); +export const PutResponse: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.endpoints.PutResponse; + json: (parsed: SeedExhaustive.endpoints.PutResponse) => serializers.endpoints.PutResponse.Raw; +} = { + _schema: _PutResponse_Schema, + parse: (raw: unknown) => _PutResponse_Schema.parse(raw) as SeedExhaustive.endpoints.PutResponse, + json: (parsed: SeedExhaustive.endpoints.PutResponse) => + ({ + errors: + parsed.errors != null + ? parsed.errors != null + ? parsed.errors.map((item) => Error_.json(item)) + : parsed.errors + : parsed.errors, + }) as serializers.endpoints.PutResponse.Raw, +}; + +export declare namespace PutResponse { + export interface Raw { + errors?: Error_.Raw[] | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..66e101cdc2d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1,4 @@ +export * as noEndingSlash from "./noEndingSlash.js"; +export * as withEndingSlash from "./withEndingSlash.js"; +export * as withMixedCase from "./withMixedCase.js"; +export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts new file mode 100644 index 000000000000..792cdff843dd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.noEndingSlash.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.noEndingSlash.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts new file mode 100644 index 000000000000..05918aed9575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withEndingSlash.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withEndingSlash.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts new file mode 100644 index 000000000000..ef6df73d7ec0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withMixedCase.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withMixedCase.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts new file mode 100644 index 000000000000..3e792cbc8530 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.endpoints.urls.withUnderscores.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.endpoints.urls.withUnderscores.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..f7a345d3368a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../api/index.js"; +import type * as serializers from "../../../index.js"; + +const _BadObjectRequestInfo_Schema = z.object({ + message: z.string(), +}); +export const BadObjectRequestInfo: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.BadObjectRequestInfo; + json: (parsed: SeedExhaustive.BadObjectRequestInfo) => serializers.BadObjectRequestInfo.Raw; +} = { + _schema: _BadObjectRequestInfo_Schema, + parse: (raw: unknown) => _BadObjectRequestInfo_Schema.parse(raw) as SeedExhaustive.BadObjectRequestInfo, + json: (parsed: SeedExhaustive.BadObjectRequestInfo) => parsed as serializers.BadObjectRequestInfo.Raw, +}; + +export declare namespace BadObjectRequestInfo { + export interface Raw { + message: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts new file mode 100644 index 000000000000..20b614a89e2f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/index.ts @@ -0,0 +1,9 @@ +export * as endpoints from "./endpoints/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..afdc575ededd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,40 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../api/index.js"; +import type * as serializers from "../../../../index.js"; +import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; + +const _PostWithObjectBody_Schema = z + .object({ + string: z.string(), + integer: z.number(), + NestedObject: ObjectWithOptionalField._schema, + }) + .transform((data) => ({ + string: data.string, + integer: data.integer, + nestedObject: data.NestedObject, + })); +export const PostWithObjectBody: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.PostWithObjectBody; + json: (parsed: SeedExhaustive.PostWithObjectBody) => serializers.PostWithObjectBody.Raw; +} = { + _schema: _PostWithObjectBody_Schema, + parse: (raw: unknown) => _PostWithObjectBody_Schema.parse(raw) as SeedExhaustive.PostWithObjectBody, + json: (parsed: SeedExhaustive.PostWithObjectBody) => + ({ + string: parsed.string, + integer: parsed.integer, + NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), + }) as serializers.PostWithObjectBody.Raw, +}; + +export declare namespace PostWithObjectBody { + export interface Raw { + string: string; + integer: number; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..d62a81ce61fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..549edcdba7f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts new file mode 100644 index 000000000000..7c8d3bf63cc1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../index.js"; + +const _Response_Schema = z.boolean(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => boolean; + json: (parsed: boolean) => serializers.noAuth.postWithNoAuth.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as boolean, + json: (parsed: boolean) => parsed as serializers.noAuth.postWithNoAuth.Response.Raw, +}; + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..b62616349ec6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts new file mode 100644 index 000000000000..5880dd1a7111 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../index.js"; + +const _Response_Schema = z.string(); +export const Response: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.noReqBody.postWithNoRequestBody.Response.Raw; +} = { + _schema: _Response_Schema, + parse: (raw: unknown) => _Response_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.noReqBody.postWithNoRequestBody.Response.Raw, +}; + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts new file mode 100644 index 000000000000..f3d5598805ba --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as serializers from "../../../index.js"; + +const _Request_Schema = z.string(); +export const Request: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => string; + json: (parsed: string) => serializers.reqWithHeaders.getWithCustomHeader.Request.Raw; +} = { + _schema: _Request_Schema, + parse: (raw: unknown) => _Request_Schema.parse(raw) as string, + json: (parsed: string) => parsed as serializers.reqWithHeaders.getWithCustomHeader.Request.Raw, +}; + +export declare namespace Request { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..fb7f25afb170 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..fda1be806c19 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithDocs_Schema = z.object({ + string: z.string(), +}); +export const ObjectWithDocs: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithDocs; + json: (parsed: SeedExhaustive.types.ObjectWithDocs) => serializers.types.ObjectWithDocs.Raw; +} = { + _schema: _ObjectWithDocs_Schema, + parse: (raw: unknown) => _ObjectWithDocs_Schema.parse(raw) as SeedExhaustive.types.ObjectWithDocs, + json: (parsed: SeedExhaustive.types.ObjectWithDocs) => parsed as serializers.types.ObjectWithDocs.Raw, +}; + +export declare namespace ObjectWithDocs { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..feebc1f6a916 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _WeatherReport_Schema = z.enum(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); +export const WeatherReport: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.WeatherReport; + json: (parsed: SeedExhaustive.types.WeatherReport) => serializers.types.WeatherReport.Raw; +} = { + _schema: _WeatherReport_Schema, + parse: (raw: unknown) => _WeatherReport_Schema.parse(raw) as SeedExhaustive.types.WeatherReport, + json: (parsed: SeedExhaustive.types.WeatherReport) => parsed as serializers.types.WeatherReport.Raw, +}; + +export declare namespace WeatherReport { + export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts new file mode 100644 index 000000000000..52175f3cee16 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/index.ts @@ -0,0 +1,8 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..a68dc56bdfba --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { OptionalAlias } from "./OptionalAlias.js"; + +const _DoubleOptional_Schema = z.object({ + optionalAlias: OptionalAlias._schema.optional(), +}); +export const DoubleOptional: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.DoubleOptional; + json: (parsed: SeedExhaustive.types.DoubleOptional) => serializers.types.DoubleOptional.Raw; +} = { + _schema: _DoubleOptional_Schema, + parse: (raw: unknown) => _DoubleOptional_Schema.parse(raw) as SeedExhaustive.types.DoubleOptional, + json: (parsed: SeedExhaustive.types.DoubleOptional) => + ({ + optionalAlias: + parsed.optionalAlias != null + ? parsed.optionalAlias != null + ? OptionalAlias.json(parsed.optionalAlias) + : parsed.optionalAlias + : parsed.optionalAlias, + }) as serializers.types.DoubleOptional.Raw, +}; + +export declare namespace DoubleOptional { + export interface Raw { + optionalAlias?: (OptionalAlias.Raw | undefined) | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..c90be8618d11 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,44 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +const _NestedObjectWithOptionalField_Schema = z + .object({ + string: z.string().optional(), + NestedObject: ObjectWithOptionalField._schema.optional(), + }) + .transform((data) => ({ + string: data.string, + nestedObject: data.NestedObject, + })); +export const NestedObjectWithOptionalField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithOptionalField; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithOptionalField, + ) => serializers.types.NestedObjectWithOptionalField.Raw; +} = { + _schema: _NestedObjectWithOptionalField_Schema, + parse: (raw: unknown) => + _NestedObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithOptionalField, + json: (parsed: SeedExhaustive.types.NestedObjectWithOptionalField) => + ({ + string: parsed.string, + NestedObject: + parsed.nestedObject != null + ? parsed.nestedObject != null + ? ObjectWithOptionalField.json(parsed.nestedObject) + : parsed.nestedObject + : parsed.nestedObject, + }) as serializers.types.NestedObjectWithOptionalField.Raw, +}; + +export declare namespace NestedObjectWithOptionalField { + export interface Raw { + string?: string | null; + NestedObject?: ObjectWithOptionalField.Raw | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..ef7b8353d527 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +const _NestedObjectWithRequiredField_Schema = z + .object({ + string: z.string(), + NestedObject: ObjectWithOptionalField._schema, + }) + .transform((data) => ({ + string: data.string, + nestedObject: data.NestedObject, + })); +export const NestedObjectWithRequiredField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.NestedObjectWithRequiredField; + json: ( + parsed: SeedExhaustive.types.NestedObjectWithRequiredField, + ) => serializers.types.NestedObjectWithRequiredField.Raw; +} = { + _schema: _NestedObjectWithRequiredField_Schema, + parse: (raw: unknown) => + _NestedObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.NestedObjectWithRequiredField, + json: (parsed: SeedExhaustive.types.NestedObjectWithRequiredField) => + ({ + string: parsed.string, + NestedObject: ObjectWithOptionalField.json(parsed.nestedObject), + }) as serializers.types.NestedObjectWithRequiredField.Raw, +}; + +export declare namespace NestedObjectWithRequiredField { + export interface Raw { + string: string; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..714c7594bacd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithMapOfMap_Schema = z.object({ + map: z.record(z.string(), z.record(z.string(), z.string())), +}); +export const ObjectWithMapOfMap: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithMapOfMap; + json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => serializers.types.ObjectWithMapOfMap.Raw; +} = { + _schema: _ObjectWithMapOfMap_Schema, + parse: (raw: unknown) => _ObjectWithMapOfMap_Schema.parse(raw) as SeedExhaustive.types.ObjectWithMapOfMap, + json: (parsed: SeedExhaustive.types.ObjectWithMapOfMap) => parsed as serializers.types.ObjectWithMapOfMap.Raw, +}; + +export declare namespace ObjectWithMapOfMap { + export interface Raw { + map: Record>; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..29084d0e7dc7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,74 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithOptionalField_Schema = z.object({ + string: z.string().optional(), + integer: z.number().optional(), + long: z.number().optional(), + double: z.number().optional(), + bool: z.boolean().optional(), + datetime: z + .string() + .transform((s) => new Date(s)) + .optional(), + date: z.string().optional(), + uuid: z.string().optional(), + base64: z.string().optional(), + list: z.array(z.string()).optional(), + set: z + .array(z.string()) + .transform((arr) => new Set(arr)) + .optional(), + map: z.record(z.string(), z.string()).optional(), + bigint: z.string().optional(), +}); +export const ObjectWithOptionalField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithOptionalField; + json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => serializers.types.ObjectWithOptionalField.Raw; +} = { + _schema: _ObjectWithOptionalField_Schema, + parse: (raw: unknown) => _ObjectWithOptionalField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithOptionalField, + json: (parsed: SeedExhaustive.types.ObjectWithOptionalField) => + ({ + string: parsed.string, + integer: parsed.integer, + long: parsed.long, + double: parsed.double, + bool: parsed.bool, + datetime: + parsed.datetime != null + ? parsed.datetime != null + ? parsed.datetime.toISOString() + : parsed.datetime + : parsed.datetime, + date: parsed.date, + uuid: parsed.uuid, + base64: parsed.base64, + list: parsed.list, + set: parsed.set != null ? (parsed.set != null ? Array.from(parsed.set) : parsed.set) : parsed.set, + map: parsed.map, + bigint: parsed.bigint, + }) as serializers.types.ObjectWithOptionalField.Raw, +}; + +export declare namespace ObjectWithOptionalField { + export interface Raw { + string?: string | null; + integer?: number | null; + long?: number | null; + double?: number | null; + bool?: boolean | null; + datetime?: string | null; + date?: string | null; + uuid?: string | null; + base64?: string | null; + list?: string[] | null; + set?: string[] | null; + map?: Record | null; + bigint?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..a721771913f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,25 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _ObjectWithRequiredField_Schema = z.object({ + string: z.string(), +}); +export const ObjectWithRequiredField: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.ObjectWithRequiredField; + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => serializers.types.ObjectWithRequiredField.Raw; +} = { + _schema: _ObjectWithRequiredField_Schema, + parse: (raw: unknown) => _ObjectWithRequiredField_Schema.parse(raw) as SeedExhaustive.types.ObjectWithRequiredField, + json: (parsed: SeedExhaustive.types.ObjectWithRequiredField) => + parsed as serializers.types.ObjectWithRequiredField.Raw, +}; + +export declare namespace ObjectWithRequiredField { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..a243622f1ee5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _OptionalAlias_Schema = z.string().optional(); +export const OptionalAlias: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.OptionalAlias; + json: (parsed: SeedExhaustive.types.OptionalAlias) => serializers.types.OptionalAlias.Raw; +} = { + _schema: _OptionalAlias_Schema, + parse: (raw: unknown) => _OptionalAlias_Schema.parse(raw) as SeedExhaustive.types.OptionalAlias, + json: (parsed: SeedExhaustive.types.OptionalAlias) => parsed as serializers.types.OptionalAlias.Raw, +}; + +export declare namespace OptionalAlias { + export type Raw = string | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..91b493ad4f9a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,35 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Cat } from "./Cat.js"; +import { Dog } from "./Dog.js"; + +const _Animal_Schema = z + .discriminatedUnion("animal", [ + z.object({ animal: z.literal("dog") }).merge(Dog._schema as z.AnyZodObject), + z.object({ animal: z.literal("cat") }).merge(Cat._schema as z.AnyZodObject), + ]) + .transform((value) => value); +export const Animal: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Animal; + json: (parsed: SeedExhaustive.types.Animal) => serializers.types.Animal.Raw; +} = { + _schema: _Animal_Schema, + parse: (raw: unknown) => _Animal_Schema.parse(raw) as SeedExhaustive.types.Animal, + json: (parsed: SeedExhaustive.types.Animal) => parsed as serializers.types.Animal.Raw, +}; + +export declare namespace Animal { + export type Raw = Animal.Dog | Animal.Cat; + + export interface Dog extends Dog.Raw { + animal: "dog"; + } + + export interface Cat extends Cat.Raw { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..0d6da57ce642 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _Cat_Schema = z.object({ + name: z.string(), + likesToMeow: z.boolean(), +}); +export const Cat: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Cat; + json: (parsed: SeedExhaustive.types.Cat) => serializers.types.Cat.Raw; +} = { + _schema: _Cat_Schema, + parse: (raw: unknown) => _Cat_Schema.parse(raw) as SeedExhaustive.types.Cat, + json: (parsed: SeedExhaustive.types.Cat) => parsed as serializers.types.Cat.Raw, +}; + +export declare namespace Cat { + export interface Raw { + name: string; + likesToMeow: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..0547a8bc7e85 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import { z } from "zod"; +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as serializers from "../../../../../index.js"; + +const _Dog_Schema = z.object({ + name: z.string(), + likesToWoof: z.boolean(), +}); +export const Dog: { + _schema: z.ZodTypeAny; + parse: (raw: unknown) => SeedExhaustive.types.Dog; + json: (parsed: SeedExhaustive.types.Dog) => serializers.types.Dog.Raw; +} = { + _schema: _Dog_Schema, + parse: (raw: unknown) => _Dog_Schema.parse(raw) as SeedExhaustive.types.Dog, + json: (parsed: SeedExhaustive.types.Dog) => parsed as serializers.types.Dog.Raw, +}; + +export declare namespace Dog { + export interface Raw { + name: string; + likesToWoof: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/serialization/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..98b9ec0c58b9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + expect(response).toEqual(new Set(["string"])); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..4bc8916f7ce5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..b9e26c032ff9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..685826602e5e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..650fc620bb1d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..61b5a64bce8f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..8f5f6a59a512 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a128d4844ba2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zod/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json new file mode 100644 index 000000000000..bc0673c609b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.fern/metadata.json @@ -0,0 +1,8 @@ +{ + "cliVersion": "DUMMY", + "generatorName": "fernapi/fern-typescript-sdk", + "generatorVersion": "latest", + "generatorConfig": { + "serializationFormat": "zurg" + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml new file mode 100644 index 000000000000..836106996595 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Compile + run: pnpm build + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test + run: pnpm test + + publish: + needs: [ compile, test ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v6 + + - name: Set up node + uses: actions/setup-node@v6 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + if [[ ${GITHUB_REF} == *alpha* ]]; then + publish --access public --tag alpha + elif [[ ${GITHUB_REF} == *beta* ]]; then + publish --access public --tag beta + else + publish --access public + fi + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore new file mode 100644 index 000000000000..72271e049c02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/.gitignore @@ -0,0 +1,3 @@ +node_modules +.DS_Store +/dist \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md new file mode 100644 index 000000000000..fe5bc2f77e0b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/CONTRIBUTING.md @@ -0,0 +1,133 @@ +# Contributing + +Thanks for your interest in contributing to this SDK! This document provides guidelines for contributing to the project. + +## Getting Started + +### Prerequisites + +- Node.js 20 or higher +- pnpm package manager + +### Installation + +Install the project dependencies: + +```bash +pnpm install +``` + +### Building + +Build the project: + +```bash +pnpm build +``` + +### Testing + +Run the test suite: + +```bash +pnpm test +``` + +Run specific test types: +- `pnpm test:unit` - Run unit tests +- `pnpm test:wire` - Run wire/integration tests + +### Linting and Formatting + +Check code style: + +```bash +pnpm run lint +pnpm run format:check +``` + +Fix code style issues: + +```bash +pnpm run lint:fix +pnpm run format:fix +``` + +Or use the combined check command: + +```bash +pnpm run check:fix +``` + +## About Generated Code + +**Important**: Most files in this SDK are automatically generated by [Fern](https://buildwithfern.com) from the API definition. Direct modifications to generated files will be overwritten the next time the SDK is generated. + +### Generated Files + +The following directories contain generated code: +- `src/api/` - API client classes and types +- `src/serialization/` - Serialization/deserialization logic +- Most TypeScript files in `src/` + +### How to Customize + +If you need to customize the SDK, you have two options: + +#### Option 1: Use `.fernignore` + +For custom code that should persist across SDK regenerations: + +1. Create a `.fernignore` file in the project root +2. Add file patterns for files you want to preserve (similar to `.gitignore` syntax) +3. Add your custom code to those files + +Files listed in `.fernignore` will not be overwritten when the SDK is regenerated. + +For more information, see the [Fern documentation on custom code](https://buildwithfern.com/learn/sdks/overview/custom-code). + +#### Option 2: Contribute to the Generator + +If you want to change how code is generated for all users of this SDK: + +1. The TypeScript SDK generator lives in the [Fern repository](https://github.com/fern-api/fern) +2. Generator code is located at `generators/typescript/sdk/` +3. Follow the [Fern contributing guidelines](https://github.com/fern-api/fern/blob/main/CONTRIBUTING.md) +4. Submit a pull request with your changes to the generator + +This approach is best for: +- Bug fixes in generated code +- New features that would benefit all users +- Improvements to code generation patterns + +## Making Changes + +### Workflow + +1. Create a new branch for your changes +2. Make your modifications +3. Run tests to ensure nothing breaks: `pnpm test` +4. Run linting and formatting: `pnpm run check:fix` +5. Build the project: `pnpm build` +6. Commit your changes with a clear commit message +7. Push your branch and create a pull request + +### Commit Messages + +Write clear, descriptive commit messages that explain what changed and why. + +### Code Style + +This project uses automated code formatting and linting. Run `pnpm run check:fix` before committing to ensure your code meets the project's style guidelines. + +## Questions or Issues? + +If you have questions or run into issues: + +1. Check the [Fern documentation](https://buildwithfern.com) +2. Search existing [GitHub issues](https://github.com/fern-api/fern/issues) +3. Open a new issue if your question hasn't been addressed + +## License + +By contributing to this project, you agree that your contributions will be licensed under the same license as the project. diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md new file mode 100644 index 000000000000..140b1fb505f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/README.md @@ -0,0 +1,241 @@ +# Seed TypeScript Library + +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=Seed%2FTypeScript) +[![npm shield](https://img.shields.io/npm/v/@fern/exhaustive)](https://www.npmjs.com/package/@fern/exhaustive) + +The Seed TypeScript library provides convenient access to the Seed APIs from TypeScript. + +## Installation + +```sh +npm i -s @fern/exhaustive +``` + +## Reference + +A full reference for this library is available [here](./reference.md). + +## Usage + +Instantiate and use the client with the following: + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ environment: "YOUR_BASE_URL", token: "YOUR_TOKEN" }); +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); +``` + +## Request And Response Types + +The SDK exports all request and response types as TypeScript interfaces. Simply import them with the +following namespace: + +```typescript +import { SeedExhaustive } from "@fern/exhaustive"; + +const request: SeedExhaustive.GetWithInlinePath = { + ... +}; +``` + +## Exception Handling + +When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error +will be thrown. + +```typescript +import { SeedExhaustiveError } from "@fern/exhaustive"; + +try { + await client.endpoints.container.getAndReturnListOfPrimitives(...); +} catch (err) { + if (err instanceof SeedExhaustiveError) { + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + console.log(err.rawResponse); + } +} +``` + +## Advanced + +### Additional Headers + +If you would like to send additional headers as part of the request, use the `headers` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + headers: { + 'X-Custom-Header': 'custom value' + } +}); +``` + +### Additional Query String Parameters + +If you would like to send additional query string parameters as part of the request, use the `queryParams` request option. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + queryParams: { + 'customQueryParamKey': 'custom query param value' + } +}); +``` + +### Retries + +The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long +as the request is deemed retryable and the number of retry attempts has not grown larger than the configured +retry limit (default: 2). + +A request is deemed retryable when any of the following HTTP status codes is returned: + +- [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout) +- [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests) +- [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors) + +Use the `maxRetries` request option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + maxRetries: 0 // override maxRetries at the request level +}); +``` + +### Timeouts + +The SDK defaults to a 60 second timeout. Use the `timeoutInSeconds` option to configure this behavior. + +```typescript +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + timeoutInSeconds: 30 // override timeout to 30s +}); +``` + +### Aborting Requests + +The SDK allows users to abort requests at any point by passing in an abort signal. + +```typescript +const controller = new AbortController(); +const response = await client.endpoints.container.getAndReturnListOfPrimitives(..., { + abortSignal: controller.signal +}); +controller.abort(); // aborts the request +``` + +### Access Raw Response Data + +The SDK provides access to raw response data, including headers, through the `.withRawResponse()` method. +The `.withRawResponse()` method returns a promise that results to an object with a `data` and a `rawResponse` property. + +```typescript +const { data, rawResponse } = await client.endpoints.container.getAndReturnListOfPrimitives(...).withRawResponse(); + +console.log(data); +console.log(rawResponse.headers['X-My-Header']); +``` + +### Logging + +The SDK supports logging. You can configure the logger by passing in a `logging` object to the client options. + +```typescript +import { SeedExhaustiveClient, logging } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + logging: { + level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info + logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger + silent: false, // defaults to true, set to false to enable logging + } +}); +``` +The `logging` object can have the following properties: +- `level`: The log level to use. Defaults to `logging.LogLevel.Info`. +- `logger`: The logger to use. Defaults to a `logging.ConsoleLogger`. +- `silent`: Whether to silence the logger. Defaults to `true`. + +The `level` property can be one of the following values: +- `logging.LogLevel.Debug` +- `logging.LogLevel.Info` +- `logging.LogLevel.Warn` +- `logging.LogLevel.Error` + +To provide a custom logger, you can pass in an object that implements the `logging.ILogger` interface. + +
+Custom logger examples + +Here's an example using the popular `winston` logging library. +```ts +import winston from 'winston'; + +const winstonLogger = winston.createLogger({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => winstonLogger.debug(msg, ...args), + info: (msg, ...args) => winstonLogger.info(msg, ...args), + warn: (msg, ...args) => winstonLogger.warn(msg, ...args), + error: (msg, ...args) => winstonLogger.error(msg, ...args), +}; +``` + +Here's an example using the popular `pino` logging library. + +```ts +import pino from 'pino'; + +const pinoLogger = pino({...}); + +const logger: logging.ILogger = { + debug: (msg, ...args) => pinoLogger.debug(args, msg), + info: (msg, ...args) => pinoLogger.info(args, msg), + warn: (msg, ...args) => pinoLogger.warn(args, msg), + error: (msg, ...args) => pinoLogger.error(args, msg), +}; +``` +
+ + +### Runtime Compatibility + + +The SDK works in the following runtimes: + + + +- Node.js 18+ +- Vercel +- Cloudflare Workers +- Deno v1.25+ +- Bun 1.0+ +- React Native + +### Customizing Fetch Client + +The SDK provides a way for you to customize the underlying HTTP client / Fetch function. If you're running in an +unsupported environment, this provides a way for you to break glass and ensure the SDK works. + +```typescript +import { SeedExhaustiveClient } from "@fern/exhaustive"; + +const client = new SeedExhaustiveClient({ + ... + fetcher: // provide your implementation here +}); +``` + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. +Additions made directly to this library would have to be moved over to our generation code, +otherwise they would be overwritten upon the next generated release. Feel free to open a PR as +a proof of concept, but know that we will not be able to merge it as-is. We suggest opening +an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json new file mode 100644 index 000000000000..a777468e4ae2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/biome.json @@ -0,0 +1,74 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.1/schema.json", + "root": true, + "vcs": { + "enabled": false + }, + "files": { + "ignoreUnknown": true, + "includes": [ + "**", + "!!dist", + "!!**/dist", + "!!lib", + "!!**/lib", + "!!_tmp_*", + "!!**/_tmp_*", + "!!*.tmp", + "!!**/*.tmp", + "!!.tmp/", + "!!**/.tmp/", + "!!*.log", + "!!**/*.log", + "!!**/.DS_Store", + "!!**/Thumbs.db" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "linter": { + "rules": { + "style": { + "useNodejsImportProtocol": "off" + }, + "suspicious": { + "noAssignInExpressions": "warn", + "noUselessEscapeInString": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noThenProperty": "warn", + "useIterableCallbackReturn": "warn", + "noShadowRestrictedNames": "warn", + "noTsIgnore": { + "level": "warn", + "fix": "none", + "options": {} + }, + "noConfusingVoidType": { + "level": "warn", + "fix": "none", + "options": {} + } + } + } + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json new file mode 100644 index 000000000000..ac3de0f37468 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/package.json @@ -0,0 +1,78 @@ +{ + "name": "@fern/exhaustive", + "version": "0.0.1", + "private": false, + "repository": "github:exhaustive/fern", + "type": "commonjs", + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", + "exports": { + ".": { + "types": "./dist/cjs/index.d.ts", + "import": { + "types": "./dist/esm/index.d.mts", + "default": "./dist/esm/index.mjs" + }, + "require": { + "types": "./dist/cjs/index.d.ts", + "default": "./dist/cjs/index.js" + }, + "default": "./dist/cjs/index.js" + }, + "./serialization": { + "types": "./dist/cjs/serialization/index.d.ts", + "import": { + "types": "./dist/esm/serialization/index.d.mts", + "default": "./dist/esm/serialization/index.mjs" + }, + "require": { + "types": "./dist/cjs/serialization/index.d.ts", + "default": "./dist/cjs/serialization/index.js" + }, + "default": "./dist/cjs/serialization/index.js" + }, + "./package.json": "./package.json" + }, + "files": [ + "dist", + "reference.md", + "README.md", + "LICENSE" + ], + "scripts": { + "format": "biome format --write --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "format:check": "biome format --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint": "biome lint --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "lint:fix": "biome lint --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check": "biome check --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "check:fix": "biome check --fix --unsafe --skip-parse-errors --no-errors-on-unmatched --max-diagnostics=none", + "build": "pnpm build:cjs && pnpm build:esm", + "build:cjs": "tsc --project ./tsconfig.cjs.json", + "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm", + "test": "vitest", + "test:unit": "vitest --project unit", + "test:wire": "vitest --project wire" + }, + "dependencies": {}, + "devDependencies": { + "webpack": "^5.97.1", + "ts-loader": "^9.5.1", + "vitest": "^3.2.4", + "msw": "2.11.2", + "@types/node": "^18.19.70", + "typescript": "~5.7.2", + "@biomejs/biome": "2.3.1" + }, + "browser": { + "fs": false, + "os": false, + "path": false, + "stream": false + }, + "packageManager": "pnpm@10.20.0", + "engines": { + "node": ">=18.0.0" + }, + "sideEffects": false +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml new file mode 100644 index 000000000000..6e4c395107df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/pnpm-workspace.yaml @@ -0,0 +1 @@ +packages: ['.'] \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md new file mode 100644 index 000000000000..b571afcab9fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/reference.md @@ -0,0 +1,2761 @@ +# Reference +## Endpoints Container +
client.endpoints.container.getAndReturnListOfPrimitives({ ...params }) -> string[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnListOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnListOfObjects([{ + string: "string" + }, { + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfPrimitives({ ...params }) -> Set +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Set` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnSetOfObjects({ ...params }) -> SeedExhaustive.ObjectWithRequiredField[] +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnSetOfObjects([{ + string: "string" + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapPrimToPrim({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapPrimToPrim({ + "string": "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnMapOfPrimToObject({ ...params }) -> Record +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnMapOfPrimToObject({ + "string": { + string: "string" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Record` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.container.getAndReturnOptional({ ...params }) -> SeedExhaustive.ObjectWithRequiredField | undefined +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.container.getAndReturnOptional({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ContainerClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints ContentType +
client.endpoints.contentType.postJsonPatchContentType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.contentType.postJsonPatchContentWithCharsetType({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ContentTypeClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Enum +
client.endpoints.enum.getAndReturnEnum({ ...params }) -> SeedExhaustive.WeatherReport +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.enum.getAndReturnEnum("SUNNY"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.WeatherReport` + +
+
+ +
+
+ +**requestOptions:** `EnumClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints HttpMethods +
client.endpoints.httpMethods.testGet(id) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testGet("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPost({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPost({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPut(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPut("id", { + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testPatch(id, { ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.httpMethods.testDelete(id) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.httpMethods.testDelete("id"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**id:** `string` + +
+
+ +
+
+ +**requestOptions:** `HttpMethodsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Object +
client.endpoints.object.getAndReturnWithOptionalField({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithRequiredField({ ...params }) -> SeedExhaustive.ObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnWithMapOfMap({ ...params }) -> SeedExhaustive.ObjectWithMapOfMap +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + "map": { + "map": "map" + } + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ObjectWithMapOfMap` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithOptionalField({ ...params }) -> SeedExhaustive.NestedObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithOptionalField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredField(string, { ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**string:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList({ ...params }) -> SeedExhaustive.NestedObjectWithRequiredField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }, { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } + }]); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.NestedObjectWithRequiredField[]` + +
+
+ +
+
+ +**requestOptions:** `ObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Params +
client.endpoints.params.getWithPath(param) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPath("param"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePath({ + param: "param" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithAllowMultipleQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with multiple of same query param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1 +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithMultipleQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithPathAndQuery(param, { ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithPathAndQuery("param", { + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithPathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.getWithInlinePathAndQuery({ ...params }) -> void +
+
+ +#### 📝 Description + +
+
+ +
+
+ +GET with path and query params +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.GetWithInlinePathAndQuery` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithPath(param, { ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithPath("param", "string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**param:** `string` + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.params.modifyWithInlinePath({ ...params }) -> string +
+
+ +#### 📝 Description + +
+
+ +
+
+ +PUT to update with path param +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.ModifyResourceAtInlinedPath` + +
+
+ +
+
+ +**requestOptions:** `ParamsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Primitive +
client.endpoints.primitive.getAndReturnString({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnString("string"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnInt({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnInt(1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnLong({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnLong(1000000); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDouble({ ...params }) -> number +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDouble(1.1); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `number` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBool({ ...params }) -> boolean +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBool(true); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `boolean` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDatetime({ ...params }) -> Date +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `Date` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnDate({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnUuid({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.primitive.getAndReturnBase64({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `PrimitiveClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Put +
client.endpoints.put.add({ ...params }) -> SeedExhaustive.PutResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.put.add({ + id: "id" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.endpoints.PutRequest` + +
+
+ +
+
+ +**requestOptions:** `PutClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Union +
client.endpoints.union.getAndReturnUnion({ ...params }) -> SeedExhaustive.Animal +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.Animal` + +
+
+ +
+
+ +**requestOptions:** `UnionClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## Endpoints Urls +
client.endpoints.urls.withMixedCase() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withMixedCase(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.noEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.noEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withEndingSlash() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withEndingSlash(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.endpoints.urls.withUnderscores() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.endpoints.urls.withUnderscores(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `UrlsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## InlinedRequests +
client.inlinedRequests.postWithObjectBodyandResponse({ ...params }) -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST with custom object in request body, response is an object +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map" + }, + bigint: "1000000" + } +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.PostWithObjectBody` + +
+
+ +
+
+ +**requestOptions:** `InlinedRequestsClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoAuth +
client.noAuth.postWithNoAuth({ ...params }) -> boolean +
+
+ +#### 📝 Description + +
+
+ +
+
+ +POST request with no auth +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noAuth.postWithNoAuth({ + "key": "value" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `unknown` + +
+
+ +
+
+ +**requestOptions:** `NoAuthClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## NoReqBody +
client.noReqBody.getWithNoRequestBody() -> SeedExhaustive.ObjectWithOptionalField +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.getWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.noReqBody.postWithNoRequestBody() -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.noReqBody.postWithNoRequestBody(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `NoReqBodyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +## ReqWithHeaders +
client.reqWithHeaders.getWithCustomHeader({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedExhaustive.ReqWithHeaders` + +
+
+ +
+
+ +**requestOptions:** `ReqWithHeadersClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js new file mode 100644 index 000000000000..dc1df1cbbacb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/scripts/rename-to-esm-files.js @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +const fs = require("fs").promises; +const path = require("path"); + +const extensionMap = { + ".js": ".mjs", + ".d.ts": ".d.mts", +}; +const oldExtensions = Object.keys(extensionMap); + +async function findFiles(rootPath) { + const files = []; + + async function scan(directory) { + const entries = await fs.readdir(directory, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(directory, entry.name); + + if (entry.isDirectory()) { + if (entry.name !== "node_modules" && !entry.name.startsWith(".")) { + await scan(fullPath); + } + } else if (entry.isFile()) { + if (oldExtensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + } + + await scan(rootPath); + return files; +} + +async function updateFiles(files) { + const updatedFiles = []; + for (const file of files) { + const updated = await updateFileContents(file); + updatedFiles.push(updated); + } + + console.log(`Updated imports in ${updatedFiles.length} files.`); +} + +async function updateFileContents(file) { + const content = await fs.readFile(file, "utf8"); + + let newContent = content; + // Update each extension type defined in the map + for (const [oldExt, newExt] of Object.entries(extensionMap)) { + // Handle static imports/exports + const staticRegex = new RegExp(`(import|export)(.+from\\s+['"])(\\.\\.?\\/[^'"]+)(\\${oldExt})(['"])`, "g"); + newContent = newContent.replace(staticRegex, `$1$2$3${newExt}$5`); + + // Handle dynamic imports (yield import, await import, regular import()) + const dynamicRegex = new RegExp( + `(yield\\s+import|await\\s+import|import)\\s*\\(\\s*['"](\\.\\.\?\\/[^'"]+)(\\${oldExt})['"]\\s*\\)`, + "g", + ); + newContent = newContent.replace(dynamicRegex, `$1("$2${newExt}")`); + } + + if (content !== newContent) { + await fs.writeFile(file, newContent, "utf8"); + return true; + } + return false; +} + +async function renameFiles(files) { + let counter = 0; + for (const file of files) { + const ext = oldExtensions.find((ext) => file.endsWith(ext)); + const newExt = extensionMap[ext]; + + if (newExt) { + const newPath = file.slice(0, -ext.length) + newExt; + await fs.rename(file, newPath); + counter++; + } + } + + console.log(`Renamed ${counter} files.`); +} + +async function main() { + try { + const targetDir = process.argv[2]; + if (!targetDir) { + console.error("Please provide a target directory"); + process.exit(1); + } + + const targetPath = path.resolve(targetDir); + const targetStats = await fs.stat(targetPath); + + if (!targetStats.isDirectory()) { + console.error("The provided path is not a directory"); + process.exit(1); + } + + console.log(`Scanning directory: ${targetDir}`); + + const files = await findFiles(targetDir); + + if (files.length === 0) { + console.log("No matching files found."); + process.exit(0); + } + + console.log(`Found ${files.length} files.`); + await updateFiles(files); + await renameFiles(files); + console.log("\nDone!"); + } catch (error) { + console.error("An error occurred:", error.message); + process.exit(1); + } +} + +main(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json new file mode 100644 index 000000000000..875b76c4bb57 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/snippet.json @@ -0,0 +1,544 @@ +{ + "endpoints": [ + { + "id": { + "path": "/container/list-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfPrimitives([\"string\", \"string\"]);\n" + } + }, + { + "id": { + "path": "/container/list-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnListOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnListOfObjects([{\n string: \"string\"\n }, {\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/set-of-primitives", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfPrimitives" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfPrimitives(new Set([\"string\"]));\n" + } + }, + { + "id": { + "path": "/container/set-of-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnSetOfObjects" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnSetOfObjects([{\n string: \"string\"\n }]);\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-prim", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapPrimToPrim" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapPrimToPrim({\n \"string\": \"string\"\n});\n" + } + }, + { + "id": { + "path": "/container/map-prim-to-object", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnMapOfPrimToObject" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnMapOfPrimToObject({\n \"string\": {\n string: \"string\"\n }\n});\n" + } + }, + { + "id": { + "path": "/container/opt-objects", + "method": "POST", + "identifier_override": "endpoint_endpoints/container.getAndReturnOptional" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.container.getAndReturnOptional({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/foo/bar", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/foo/baz", + "method": "POST", + "identifier_override": "endpoint_endpoints/content-type.postJsonPatchContentWithCharsetType" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.contentType.postJsonPatchContentWithCharsetType({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/enum", + "method": "POST", + "identifier_override": "endpoint_endpoints/enum.getAndReturnEnum" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.enum.getAndReturnEnum(\"SUNNY\");\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "GET", + "identifier_override": "endpoint_endpoints/http-methods.testGet" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testGet(\"id\");\n" + } + }, + { + "id": { + "path": "/http-methods", + "method": "POST", + "identifier_override": "endpoint_endpoints/http-methods.testPost" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPost({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/http-methods.testPut" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPut(\"id\", {\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "PATCH", + "identifier_override": "endpoint_endpoints/http-methods.testPatch" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testPatch(\"id\", {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/http-methods/{id}", + "method": "DELETE", + "identifier_override": "endpoint_endpoints/http-methods.testDelete" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.httpMethods.testDelete(\"id\");\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithOptionalField({\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-required-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithRequiredField({\n string: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-with-map-of-map", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnWithMapOfMap" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnWithMapOfMap({\n map: {\n \"map\": {\n \"map\": \"map\"\n }\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-optional-field", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithOptionalField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithOptionalField({\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field/{string}", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredField" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredField(\"string\", {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/object/get-and-return-nested-with-required-field-list", + "method": "POST", + "identifier_override": "endpoint_endpoints/object.getAndReturnNestedWithRequiredFieldAsList" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }, {\n string: \"string\",\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n }]);\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPath(\"param\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePath({\n param: \"param\"\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithAllowMultipleQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithAllowMultipleQuery({\n query: \"query\",\n number: 1\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithPathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithPathAndQuery(\"param\", {\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path-query/{param}", + "method": "GET", + "identifier_override": "endpoint_endpoints/params.getWithInlinePathAndQuery" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.getWithInlinePathAndQuery({\n param: \"param\",\n query: \"query\"\n});\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithPath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithPath(\"param\", \"string\");\n" + } + }, + { + "id": { + "path": "/params/path/{param}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/params.modifyWithInlinePath" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.params.modifyWithInlinePath({\n param: \"param\",\n body: \"string\"\n});\n" + } + }, + { + "id": { + "path": "/primitive/string", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnString" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnString(\"string\");\n" + } + }, + { + "id": { + "path": "/primitive/integer", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnInt" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnInt(1);\n" + } + }, + { + "id": { + "path": "/primitive/long", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnLong" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnLong(1000000);\n" + } + }, + { + "id": { + "path": "/primitive/double", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDouble" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDouble(1.1);\n" + } + }, + { + "id": { + "path": "/primitive/boolean", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBool" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBool(true);\n" + } + }, + { + "id": { + "path": "/primitive/datetime", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDatetime" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDatetime(new Date(\"2024-01-15T09:30:00.000Z\"));\n" + } + }, + { + "id": { + "path": "/primitive/date", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnDate" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnDate(\"2023-01-15\");\n" + } + }, + { + "id": { + "path": "/primitive/uuid", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnUUID" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnUuid(\"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\");\n" + } + }, + { + "id": { + "path": "/primitive/base64", + "method": "POST", + "identifier_override": "endpoint_endpoints/primitive.getAndReturnBase64" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.primitive.getAndReturnBase64(\"SGVsbG8gd29ybGQh\");\n" + } + }, + { + "id": { + "path": "/{id}", + "method": "PUT", + "identifier_override": "endpoint_endpoints/put.add" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.put.add({\n id: \"id\"\n});\n" + } + }, + { + "id": { + "path": "/union", + "method": "POST", + "identifier_override": "endpoint_endpoints/union.getAndReturnUnion" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.union.getAndReturnUnion({\n animal: \"dog\",\n name: \"name\",\n likesToWoof: true\n});\n" + } + }, + { + "id": { + "path": "/urls/MixedCase", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withMixedCase" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withMixedCase();\n" + } + }, + { + "id": { + "path": "/urls/no-ending-slash", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.noEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.noEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with-ending-slash/", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withEndingSlash" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withEndingSlash();\n" + } + }, + { + "id": { + "path": "/urls/with_underscores", + "method": "GET", + "identifier_override": "endpoint_endpoints/urls.withUnderscores" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.endpoints.urls.withUnderscores();\n" + } + }, + { + "id": { + "path": "/req-bodies/object", + "method": "POST", + "identifier_override": "endpoint_inlined-requests.postWithObjectBodyandResponse" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.inlinedRequests.postWithObjectBodyandResponse({\n string: \"string\",\n integer: 1,\n nestedObject: {\n string: \"string\",\n integer: 1,\n long: 1000000,\n double: 1.1,\n bool: true,\n datetime: new Date(\"2024-01-15T09:30:00.000Z\"),\n date: \"2023-01-15\",\n uuid: \"d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32\",\n base64: \"SGVsbG8gd29ybGQh\",\n list: [\"list\", \"list\"],\n set: new Set([\"set\"]),\n map: {\n 1: \"map\"\n },\n bigint: \"1000000\"\n }\n});\n" + } + }, + { + "id": { + "path": "/no-auth", + "method": "POST", + "identifier_override": "endpoint_no-auth.postWithNoAuth" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noAuth.postWithNoAuth({\n \"key\": \"value\"\n});\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "GET", + "identifier_override": "endpoint_no-req-body.getWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.getWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/no-req-body", + "method": "POST", + "identifier_override": "endpoint_no-req-body.postWithNoRequestBody" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.noReqBody.postWithNoRequestBody();\n" + } + }, + { + "id": { + "path": "/test-headers/custom-header", + "method": "POST", + "identifier_override": "endpoint_req-with-headers.getWithCustomHeader" + }, + "snippet": { + "type": "typescript", + "client": "import { SeedExhaustiveClient } from \"@fern/exhaustive\";\n\nconst client = new SeedExhaustiveClient({ environment: \"YOUR_BASE_URL\", token: \"YOUR_TOKEN\" });\nawait client.reqWithHeaders.getWithCustomHeader({\n xTestServiceHeader: \"X-TEST-SERVICE-HEADER\",\n xTestEndpointHeader: \"X-TEST-ENDPOINT-HEADER\",\n body: \"string\"\n});\n" + } + } + ], + "types": {} +} \ No newline at end of file diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts new file mode 100644 index 000000000000..3ab4e838f800 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/BaseClient.ts @@ -0,0 +1,81 @@ +// This file was auto-generated by Fern from our API Definition. + +import { BearerAuthProvider } from "./auth/BearerAuthProvider.js"; +import { mergeHeaders } from "./core/headers.js"; +import * as core from "./core/index.js"; + +export type BaseClientOptions = { + environment: core.Supplier; + /** Specify a custom URL to connect the client to. */ + baseUrl?: core.Supplier; + /** Additional headers to include in requests. */ + headers?: Record | null | undefined>; + /** The default maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The default number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** Provide a custom fetch implementation. Useful for platforms that don't have a built-in fetch or need a custom implementation. */ + fetch?: typeof fetch; + /** Configure logging for the client. */ + logging?: core.logging.LogConfig | core.logging.Logger; +} & BearerAuthProvider.AuthOptions; + +export interface BaseRequestOptions { + /** The maximum time to wait for a response in seconds. */ + timeoutInSeconds?: number; + /** The number of times to retry the request. Defaults to 2. */ + maxRetries?: number; + /** A hook to abort the request. */ + abortSignal?: AbortSignal; + /** Additional query string parameters to include in the request. */ + queryParams?: Record; + /** Additional headers to include in the request. */ + headers?: Record | null | undefined>; +} + +export type NormalizedClientOptions = T & { + logging: core.logging.Logger; + authProvider?: core.AuthProvider; +}; + +export type NormalizedClientOptionsWithAuth = NormalizedClientOptions & { + authProvider: core.AuthProvider; +}; + +export function normalizeClientOptions(options: T): NormalizedClientOptions { + const headers = mergeHeaders( + { + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "@fern/exhaustive", + "X-Fern-SDK-Version": "0.0.1", + "User-Agent": "@fern/exhaustive/0.0.1", + "X-Fern-Runtime": core.RUNTIME.type, + "X-Fern-Runtime-Version": core.RUNTIME.version, + }, + options?.headers, + ); + + return { + ...options, + logging: core.logging.createLogger(options?.logging), + headers, + } as NormalizedClientOptions; +} + +export function normalizeClientOptionsWithAuth( + options: T, +): NormalizedClientOptionsWithAuth { + const normalized = normalizeClientOptions(options) as NormalizedClientOptionsWithAuth; + const normalizedWithNoOpAuthProvider = withNoOpAuthProvider(normalized); + normalized.authProvider ??= new BearerAuthProvider(normalizedWithNoOpAuthProvider); + return normalized; +} + +function withNoOpAuthProvider( + options: NormalizedClientOptions, +): NormalizedClientOptionsWithAuth { + return { + ...options, + authProvider: new core.NoOpAuthProvider(), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts new file mode 100644 index 000000000000..370640f5862d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/Client.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import { EndpointsClient } from "./api/resources/endpoints/client/Client.js"; +import { InlinedRequestsClient } from "./api/resources/inlinedRequests/client/Client.js"; +import { NoAuthClient } from "./api/resources/noAuth/client/Client.js"; +import { NoReqBodyClient } from "./api/resources/noReqBody/client/Client.js"; +import { ReqWithHeadersClient } from "./api/resources/reqWithHeaders/client/Client.js"; +import type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "./BaseClient.js"; + +export declare namespace SeedExhaustiveClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class SeedExhaustiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _endpoints: EndpointsClient | undefined; + protected _inlinedRequests: InlinedRequestsClient | undefined; + protected _noAuth: NoAuthClient | undefined; + protected _noReqBody: NoReqBodyClient | undefined; + protected _reqWithHeaders: ReqWithHeadersClient | undefined; + + constructor(options: SeedExhaustiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get endpoints(): EndpointsClient { + return (this._endpoints ??= new EndpointsClient(this._options)); + } + + public get inlinedRequests(): InlinedRequestsClient { + return (this._inlinedRequests ??= new InlinedRequestsClient(this._options)); + } + + public get noAuth(): NoAuthClient { + return (this._noAuth ??= new NoAuthClient(this._options)); + } + + public get noReqBody(): NoReqBodyClient { + return (this._noReqBody ??= new NoReqBodyClient(this._options)); + } + + public get reqWithHeaders(): ReqWithHeadersClient { + return (this._reqWithHeaders ??= new ReqWithHeadersClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts new file mode 100644 index 000000000000..78dcad40a3fa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/Client.ts @@ -0,0 +1,76 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { ContainerClient } from "../resources/container/client/Client.js"; +import { ContentTypeClient } from "../resources/contentType/client/Client.js"; +import { EnumClient } from "../resources/enum/client/Client.js"; +import { HttpMethodsClient } from "../resources/httpMethods/client/Client.js"; +import { ObjectClient } from "../resources/object/client/Client.js"; +import { ParamsClient } from "../resources/params/client/Client.js"; +import { PrimitiveClient } from "../resources/primitive/client/Client.js"; +import { PutClient } from "../resources/put/client/Client.js"; +import { UnionClient } from "../resources/union/client/Client.js"; +import { UrlsClient } from "../resources/urls/client/Client.js"; + +export declare namespace EndpointsClient { + export type Options = BaseClientOptions; +} + +export class EndpointsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + protected _container: ContainerClient | undefined; + protected _contentType: ContentTypeClient | undefined; + protected _enum: EnumClient | undefined; + protected _httpMethods: HttpMethodsClient | undefined; + protected _object: ObjectClient | undefined; + protected _params: ParamsClient | undefined; + protected _primitive: PrimitiveClient | undefined; + protected _put: PutClient | undefined; + protected _union: UnionClient | undefined; + protected _urls: UrlsClient | undefined; + + constructor(options: EndpointsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + public get container(): ContainerClient { + return (this._container ??= new ContainerClient(this._options)); + } + + public get contentType(): ContentTypeClient { + return (this._contentType ??= new ContentTypeClient(this._options)); + } + + public get enum(): EnumClient { + return (this._enum ??= new EnumClient(this._options)); + } + + public get httpMethods(): HttpMethodsClient { + return (this._httpMethods ??= new HttpMethodsClient(this._options)); + } + + public get object(): ObjectClient { + return (this._object ??= new ObjectClient(this._options)); + } + + public get params(): ParamsClient { + return (this._params ??= new ParamsClient(this._options)); + } + + public get primitive(): PrimitiveClient { + return (this._primitive ??= new PrimitiveClient(this._options)); + } + + public get put(): PutClient { + return (this._put ??= new PutClient(this._options)); + } + + public get union(): UnionClient { + return (this._union ??= new UnionClient(this._options)); + } + + public get urls(): UrlsClient { + return (this._urls ??= new UrlsClient(this._options)); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts new file mode 100644 index 000000000000..9eb1192dcc32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts new file mode 100644 index 000000000000..6046c13355f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/Client.ts @@ -0,0 +1,543 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContainerClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContainerClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContainerClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]) + */ + public getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnListOfPrimitives( + request: string[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfPrimitives.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfPrimitives.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/list-of-primitives", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnListOfObjects([{ + * string: "string" + * }, { + * string: "string" + * }]) + */ + public getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnListOfObjects(request, requestOptions)); + } + + private async __getAndReturnListOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/list-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnListOfObjects.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnListOfObjects.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/list-of-objects"); + } + + /** + * @param {Set} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])) + */ + public getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfPrimitives(request, requestOptions)); + } + + private async __getAndReturnSetOfPrimitives( + request: Set, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-primitives", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-primitives"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField[]} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnSetOfObjects([{ + * string: "string" + * }]) + */ + public getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnSetOfObjects(request, requestOptions)); + } + + private async __getAndReturnSetOfObjects( + request: SeedExhaustive.types.ObjectWithRequiredField[], + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/set-of-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnSetOfObjects.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnSetOfObjects.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/set-of-objects"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapPrimToPrim({ + * "string": "string" + * }) + */ + public getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapPrimToPrim(request, requestOptions)); + } + + private async __getAndReturnMapPrimToPrim( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-prim", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/map-prim-to-prim"); + } + + /** + * @param {Record} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnMapOfPrimToObject({ + * "string": { + * string: "string" + * } + * }) + */ + public getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise> { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnMapOfPrimToObject(request, requestOptions)); + } + + private async __getAndReturnMapOfPrimToObject( + request: Record, + requestOptions?: ContainerClient.RequestOptions, + ): Promise>> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/map-prim-to-object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.parseOrThrow( + _response.body, + { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }, + ), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/container/map-prim-to-object", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ContainerClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.container.getAndReturnOptional({ + * string: "string" + * }) + */ + public getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnOptional(request, requestOptions)); + } + + private async __getAndReturnOptional( + request?: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ContainerClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/container/opt-objects", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: + request != null + ? serializers.endpoints.container.getAndReturnOptional.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }) + : undefined, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.container.getAndReturnOptional.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/container/opt-objects"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts new file mode 100644 index 000000000000..0596a90d8006 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/Client.ts @@ -0,0 +1,178 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ContentTypeClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ContentTypeClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ContentTypeClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postJsonPatchContentType(request, requestOptions)); + } + + private async __postJsonPatchContentType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/bar", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/bar"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ContentTypeClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__postJsonPatchContentWithCharsetType(request, requestOptions), + ); + } + + private async __postJsonPatchContentWithCharsetType( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ContentTypeClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/foo/baz", + ), + method: "POST", + headers: _headers, + contentType: "application/json-patch+json; charset=utf-8", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/foo/baz"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/contentType/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts new file mode 100644 index 000000000000..6e2af2b2daeb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace EnumClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class EnumClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: EnumClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.WeatherReport} request + * @param {EnumClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.enum.getAndReturnEnum("SUNNY") + */ + public getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnEnum(request, requestOptions)); + } + + private async __getAndReturnEnum( + request: SeedExhaustive.types.WeatherReport, + requestOptions?: EnumClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/enum", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.WeatherReport.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.WeatherReport.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/enum"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts new file mode 100644 index 000000000000..c34b46ee48a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/Client.ts @@ -0,0 +1,380 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace HttpMethodsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class HttpMethodsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: HttpMethodsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testGet("id") + */ + public testGet(id: string, requestOptions?: HttpMethodsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testGet(id, requestOptions)); + } + + private async __testGet( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testGet.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/http-methods/{id}"); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPost({ + * string: "string" + * }) + */ + public testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPost(request, requestOptions)); + } + + private async __testPost( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/http-methods", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/http-methods"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPut("id", { + * string: "string" + * }) + */ + public testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPut(id, request, requestOptions)); + } + + private async __testPut( + id: string, + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testPatch("id", { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testPatch(id, request, requestOptions)); + } + + private async __testPatch( + id: string, + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "PATCH", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/http-methods/{id}"); + } + + /** + * @param {string} id + * @param {HttpMethodsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.httpMethods.testDelete("id") + */ + public testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__testDelete(id, requestOptions)); + } + + private async __testDelete( + id: string, + requestOptions?: HttpMethodsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/http-methods/${core.url.encodePathParam(id)}`, + ), + method: "DELETE", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.httpMethods.testDelete.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/http-methods/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..6046843b5e42 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/index.ts @@ -0,0 +1,13 @@ +export * as container from "./container/index.js"; +export * as contentType from "./contentType/index.js"; +export * as enum_ from "./enum/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * from "./params/client/requests/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * from "./put/client/requests/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as union from "./union/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts new file mode 100644 index 000000000000..261e067c7512 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/Client.ts @@ -0,0 +1,577 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ObjectClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ObjectClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ObjectClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.ObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithOptionalField({ + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * }) + */ + public getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithOptionalField(request, requestOptions)); + } + + private async __getAndReturnWithOptionalField( + request: SeedExhaustive.types.ObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-optional-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithRequiredField({ + * string: "string" + * }) + */ + public getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithRequiredField(request, requestOptions)); + } + + private async __getAndReturnWithRequiredField( + request: SeedExhaustive.types.ObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-required-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-required-field", + ); + } + + /** + * @param {SeedExhaustive.types.ObjectWithMapOfMap} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnWithMapOfMap({ + * map: { + * "map": { + * "map": "map" + * } + * } + * }) + */ + public getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnWithMapOfMap(request, requestOptions)); + } + + private async __getAndReturnWithMapOfMap( + request: SeedExhaustive.types.ObjectWithMapOfMap, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-with-map-of-map", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.ObjectWithMapOfMap.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithMapOfMap.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-with-map-of-map", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithOptionalField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithOptionalField({ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithOptionalField(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithOptionalField( + request: SeedExhaustive.types.NestedObjectWithOptionalField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-optional-field", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithOptionalField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-optional-field", + ); + } + + /** + * @param {string} string + * @param {SeedExhaustive.types.NestedObjectWithRequiredField} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredField(string, request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredField( + string: string, + request: SeedExhaustive.types.NestedObjectWithRequiredField, + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/object/get-and-return-nested-with-required-field/${core.url.encodePathParam(string)}`, + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.NestedObjectWithRequiredField.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field/{string}", + ); + } + + /** + * @param {SeedExhaustive.types.NestedObjectWithRequiredField[]} request + * @param {ObjectClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([{ + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }, { + * string: "string", + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }]) + */ + public getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise( + this.__getAndReturnNestedWithRequiredFieldAsList(request, requestOptions), + ); + } + + private async __getAndReturnNestedWithRequiredFieldAsList( + request: SeedExhaustive.types.NestedObjectWithRequiredField[], + requestOptions?: ObjectClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/object/get-and-return-nested-with-required-field-list", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.NestedObjectWithRequiredField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError( + _response.error, + _response.rawResponse, + "POST", + "/object/get-and-return-nested-with-required-field-list", + ); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts new file mode 100644 index 000000000000..36bf861df2d2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/Client.ts @@ -0,0 +1,565 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace ParamsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ParamsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ParamsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * GET with path param + * + * @param {string} param + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPath("param") + */ + public getWithPath(param: string, requestOptions?: ParamsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPath(param, requestOptions)); + } + + private async __getWithPath( + param: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithPath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with path param + * + * @param {SeedExhaustive.endpoints.GetWithInlinePath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePath({ + * param: "param" + * }) + */ + public getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePath(request, requestOptions)); + } + + private async __getWithInlinePath( + request: SeedExhaustive.endpoints.GetWithInlinePath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.getWithInlinePath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path/{param}"); + } + + /** + * GET with query param + * + * @param {SeedExhaustive.endpoints.GetWithQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithQuery(request, requestOptions)); + } + + private async __getWithQuery( + request: SeedExhaustive.endpoints.GetWithQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + _queryParams.number = number_.toString(); + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with multiple of same query param + * + * @param {SeedExhaustive.endpoints.GetWithMultipleQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithAllowMultipleQuery({ + * query: "query", + * number: 1 + * }) + */ + public getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithAllowMultipleQuery(request, requestOptions)); + } + + private async __getWithAllowMultipleQuery( + request: SeedExhaustive.endpoints.GetWithMultipleQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query, number: number_ } = request; + const _queryParams: Record = {}; + if (Array.isArray(query)) { + _queryParams.query = query.map((item) => item); + } else { + _queryParams.query = query; + } + + if (Array.isArray(number_)) { + _queryParams.number = number_.map((item) => item.toString()); + } else { + _queryParams.number = number_.toString(); + } + + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/params", + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params"); + } + + /** + * GET with path and query params + * + * @param {string} param + * @param {SeedExhaustive.endpoints.GetWithPathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithPathAndQuery("param", { + * query: "query" + * }) + */ + public getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithPathAndQuery(param, request, requestOptions)); + } + + private async __getWithPathAndQuery( + param: string, + request: SeedExhaustive.endpoints.GetWithPathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * GET with path and query params + * + * @param {SeedExhaustive.endpoints.GetWithInlinePathAndQuery} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.getWithInlinePathAndQuery({ + * param: "param", + * query: "query" + * }) + */ + public getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithInlinePathAndQuery(request, requestOptions)); + } + + private async __getWithInlinePathAndQuery( + request: SeedExhaustive.endpoints.GetWithInlinePathAndQuery, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, query } = request; + const _queryParams: Record = {}; + _queryParams.query = query; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path-query/${core.url.encodePathParam(param)}`, + ), + method: "GET", + headers: _headers, + queryParameters: { ..._queryParams, ...requestOptions?.queryParams }, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/params/path-query/{param}"); + } + + /** + * PUT to update with path param + * + * @param {string} param + * @param {string} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithPath("param", "string") + */ + public modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithPath(param, request, requestOptions)); + } + + private async __modifyWithPath( + param: string, + request: string, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithPath.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithPath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } + + /** + * PUT to update with path param + * + * @param {SeedExhaustive.endpoints.ModifyResourceAtInlinedPath} request + * @param {ParamsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.params.modifyWithInlinePath({ + * param: "param", + * body: "string" + * }) + */ + public modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__modifyWithInlinePath(request, requestOptions)); + } + + private async __modifyWithInlinePath( + request: SeedExhaustive.endpoints.ModifyResourceAtInlinedPath, + requestOptions?: ParamsClient.RequestOptions, + ): Promise> { + const { param, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `/params/path/${core.url.encodePathParam(param)}`, + ), + method: "PUT", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.params.modifyWithInlinePath.Request.jsonOrThrow(_body, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.params.modifyWithInlinePath.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/params/path/{param}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts new file mode 100644 index 000000000000..473165eb1638 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param" + * } + */ +export interface GetWithInlinePath { + param: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts new file mode 100644 index 000000000000..9c674a852dce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithInlinePathAndQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * query: "query" + * } + */ +export interface GetWithInlinePathAndQuery { + param: string; + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts new file mode 100644 index 000000000000..baca4fafbe62 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithMultipleQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithMultipleQuery { + query: string | string[]; + number: number | number[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts new file mode 100644 index 000000000000..c3f0018a7874 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithPathAndQuery.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query" + * } + */ +export interface GetWithPathAndQuery { + query: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts new file mode 100644 index 000000000000..7ad48dee4508 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/GetWithQuery.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * query: "query", + * number: 1 + * } + */ +export interface GetWithQuery { + query: string; + number: number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts new file mode 100644 index 000000000000..f3f91a06e3f8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/ModifyResourceAtInlinedPath.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * param: "param", + * body: "string" + * } + */ +export interface ModifyResourceAtInlinedPath { + param: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts new file mode 100644 index 000000000000..b059d3702a32 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/client/requests/index.ts @@ -0,0 +1,6 @@ +export type { GetWithInlinePath } from "./GetWithInlinePath.js"; +export type { GetWithInlinePathAndQuery } from "./GetWithInlinePathAndQuery.js"; +export type { GetWithMultipleQuery } from "./GetWithMultipleQuery.js"; +export type { GetWithPathAndQuery } from "./GetWithPathAndQuery.js"; +export type { GetWithQuery } from "./GetWithQuery.js"; +export type { ModifyResourceAtInlinedPath } from "./ModifyResourceAtInlinedPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts new file mode 100644 index 000000000000..87b4fe331e4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/Client.ts @@ -0,0 +1,644 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace PrimitiveClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PrimitiveClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PrimitiveClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnString("string") + */ + public getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnString(request, requestOptions)); + } + + private async __getAndReturnString( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/string", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnString.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnString.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/string"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnInt(1) + */ + public getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnInt(request, requestOptions)); + } + + private async __getAndReturnInt( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/integer", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnInt.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnInt.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/integer"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnLong(1000000) + */ + public getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnLong(request, requestOptions)); + } + + private async __getAndReturnLong( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/long", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnLong.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnLong.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/long"); + } + + /** + * @param {number} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDouble(1.1) + */ + public getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDouble(request, requestOptions)); + } + + private async __getAndReturnDouble( + request: number, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/double", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDouble.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDouble.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/double"); + } + + /** + * @param {boolean} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBool(true) + */ + public getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBool(request, requestOptions)); + } + + private async __getAndReturnBool( + request: boolean, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/boolean", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBool.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBool.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/boolean"); + } + + /** + * @param {Date} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")) + */ + public getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDatetime(request, requestOptions)); + } + + private async __getAndReturnDatetime( + request: Date, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/datetime", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDatetime.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDatetime.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/datetime"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnDate("2023-01-15") + */ + public getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnDate(request, requestOptions)); + } + + private async __getAndReturnDate( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/date", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnDate.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnDate.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/date"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32") + */ + public getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUuid(request, requestOptions)); + } + + private async __getAndReturnUuid( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/uuid", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnUuid.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnUuid.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/uuid"); + } + + /** + * @param {string} request + * @param {PrimitiveClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh") + */ + public getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnBase64(request, requestOptions)); + } + + private async __getAndReturnBase64( + request: string, + requestOptions?: PrimitiveClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/primitive/base64", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.endpoints.primitive.getAndReturnBase64.Request.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.primitive.getAndReturnBase64.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/primitive/base64"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts new file mode 100644 index 000000000000..c9ffdb8a8cc5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/Client.ts @@ -0,0 +1,90 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace PutClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class PutClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: PutClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.endpoints.PutRequest} request + * @param {PutClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.put.add({ + * id: "id" + * }) + */ + public add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__add(request, requestOptions)); + } + + private async __add( + request: SeedExhaustive.endpoints.PutRequest, + requestOptions?: PutClient.RequestOptions, + ): Promise> { + const { id } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + `${core.url.encodePathParam(id)}`, + ), + method: "PUT", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.PutResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "PUT", "/{id}"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts new file mode 100644 index 000000000000..2beba9f087cc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/PutRequest.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * id: "id" + * } + */ +export interface PutRequest { + id: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts new file mode 100644 index 000000000000..dba0eda4bbee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/client/requests/index.ts @@ -0,0 +1 @@ +export type { PutRequest } from "./PutRequest.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..d9adb1af9a93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/index.ts @@ -0,0 +1,2 @@ +export * from "./client/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..a197fec87887 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCategory = { + ApiError: "API_ERROR", + AuthenticationError: "AUTHENTICATION_ERROR", + InvalidRequestError: "INVALID_REQUEST_ERROR", +} as const; +export type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..3943226222d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,16 @@ +// This file was auto-generated by Fern from our API Definition. + +export const ErrorCode = { + InternalServerError: "INTERNAL_SERVER_ERROR", + Unauthorized: "UNAUTHORIZED", + Forbidden: "FORBIDDEN", + BadRequest: "BAD_REQUEST", + Conflict: "CONFLICT", + Gone: "GONE", + UnprocessableEntity: "UNPROCESSABLE_ENTITY", + NotImplemented: "NOT_IMPLEMENTED", + BadGateway: "BAD_GATEWAY", + ServiceUnavailable: "SERVICE_UNAVAILABLE", + Unknown: "Unknown", +} as const; +export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..9cf9f495a09a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface Error_ { + category: SeedExhaustive.endpoints.ErrorCategory; + code: SeedExhaustive.endpoints.ErrorCode; + detail?: string; + field?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..628b46ba7298 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface PutResponse { + errors?: SeedExhaustive.endpoints.Error_[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts new file mode 100644 index 000000000000..886ba2a0978d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/Client.ts @@ -0,0 +1,97 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export declare namespace UnionClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UnionClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UnionClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.types.Animal} request + * @param {UnionClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.union.getAndReturnUnion({ + * animal: "dog", + * name: "name", + * likesToWoof: true + * }) + */ + public getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getAndReturnUnion(request, requestOptions)); + } + + private async __getAndReturnUnion( + request: SeedExhaustive.types.Animal, + requestOptions?: UnionClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/union", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.types.Animal.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.Animal.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/union"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts new file mode 100644 index 000000000000..eee779a5df14 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/Client.ts @@ -0,0 +1,247 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../../../core/headers.js"; +import * as core from "../../../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../../../errors/index.js"; +import * as serializers from "../../../../../../serialization/index.js"; + +export declare namespace UrlsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class UrlsClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: UrlsClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withMixedCase() + */ + public withMixedCase(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withMixedCase(requestOptions)); + } + + private async __withMixedCase(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/MixedCase", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withMixedCase.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/MixedCase"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.noEndingSlash() + */ + public noEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__noEndingSlash(requestOptions)); + } + + private async __noEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/no-ending-slash", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.noEndingSlash.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/no-ending-slash"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withEndingSlash() + */ + public withEndingSlash(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withEndingSlash(requestOptions)); + } + + private async __withEndingSlash(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with-ending-slash/", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withEndingSlash.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with-ending-slash/"); + } + + /** + * @param {UrlsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.endpoints.urls.withUnderscores() + */ + public withUnderscores(requestOptions?: UrlsClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__withUnderscores(requestOptions)); + } + + private async __withUnderscores(requestOptions?: UrlsClient.RequestOptions): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/urls/with_underscores", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.endpoints.urls.withUnderscores.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/urls/with_underscores"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts new file mode 100644 index 000000000000..6c0020d2b75a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/BadRequestBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../core/index.js"; +import * as errors from "../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export class BadRequestBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.BadObjectRequestInfo, rawResponse?: core.RawResponse) { + super({ + message: "BadRequestBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts new file mode 100644 index 000000000000..61778bda5417 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/errors/index.ts @@ -0,0 +1 @@ +export * from "./BadRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..6ad426742488 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface BadObjectRequestInfo { + message: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts new file mode 100644 index 000000000000..3ca611c9fb54 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/index.ts @@ -0,0 +1,11 @@ +export * as endpoints from "./endpoints/index.js"; +export * from "./generalErrors/errors/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * from "./reqWithHeaders/client/requests/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts new file mode 100644 index 000000000000..17040d946500 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/Client.ts @@ -0,0 +1,126 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace InlinedRequestsClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class InlinedRequestsClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: InlinedRequestsClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST with custom object in request body, response is an object + * + * @param {SeedExhaustive.PostWithObjectBody} request + * @param {InlinedRequestsClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.inlinedRequests.postWithObjectBodyandResponse({ + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * }) + */ + public postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithObjectBodyandResponse(request, requestOptions)); + } + + private async __postWithObjectBodyandResponse( + request: SeedExhaustive.PostWithObjectBody, + requestOptions?: InlinedRequestsClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/req-bodies/object", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.PostWithObjectBody.jsonOrThrow(request, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/req-bodies/object"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..15d3f75bc67d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,33 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../index.js"; + +/** + * @example + * { + * string: "string", + * integer: 1, + * nestedObject: { + * string: "string", + * integer: 1, + * long: 1000000, + * double: 1.1, + * bool: true, + * datetime: new Date("2024-01-15T09:30:00.000Z"), + * date: "2023-01-15", + * uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + * base64: "SGVsbG8gd29ybGQh", + * list: ["list", "list"], + * set: new Set(["set"]), + * map: { + * 1: "map" + * }, + * bigint: "1000000" + * } + * } + */ +export interface PostWithObjectBody { + string: string; + integer: number; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..104f84256770 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export type { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts new file mode 100644 index 000000000000..e2da6ff52947 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/Client.ts @@ -0,0 +1,105 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptions, normalizeClientOptions } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoAuthClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoAuthClient { + protected readonly _options: NormalizedClientOptions; + + constructor(options: NoAuthClient.Options) { + this._options = normalizeClientOptions(options); + } + + /** + * POST request with no auth + * + * @param {unknown} request + * @param {NoAuthClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @throws {@link SeedExhaustive.BadRequestBody} + * + * @example + * await client.noAuth.postWithNoAuth({ + * "key": "value" + * }) + */ + public postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoAuth(request, requestOptions)); + } + + private async __postWithNoAuth( + request?: unknown, + requestOptions?: NoAuthClient.RequestOptions, + ): Promise> { + const _headers: core.Fetcher.Args["headers"] = mergeHeaders(this._options?.headers, requestOptions?.headers); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-auth", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: request, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noAuth.postWithNoAuth.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new SeedExhaustive.BadRequestBody( + serializers.BadObjectRequestInfo.parseOrThrow(_response.error.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + _response.rawResponse, + ); + default: + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-auth"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts new file mode 100644 index 000000000000..0e5a1d42f2a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/Client.ts @@ -0,0 +1,142 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace NoReqBodyClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class NoReqBodyClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: NoReqBodyClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.getWithNoRequestBody() + */ + public getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithNoRequestBody(requestOptions)); + } + + private async __getWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "GET", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.types.ObjectWithOptionalField.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/no-req-body"); + } + + /** + * @param {NoReqBodyClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.noReqBody.postWithNoRequestBody() + */ + public postWithNoRequestBody(requestOptions?: NoReqBodyClient.RequestOptions): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__postWithNoRequestBody(requestOptions)); + } + + private async __postWithNoRequestBody( + requestOptions?: NoReqBodyClient.RequestOptions, + ): Promise> { + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/no-req-body", + ), + method: "POST", + headers: _headers, + queryParameters: requestOptions?.queryParams, + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { + data: serializers.noReqBody.postWithNoRequestBody.Response.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + skipValidation: true, + breadcrumbsPrefix: ["response"], + }), + rawResponse: _response.rawResponse, + }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/no-req-body"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts new file mode 100644 index 000000000000..081ea65568cd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/Client.ts @@ -0,0 +1,93 @@ +// This file was auto-generated by Fern from our API Definition. + +import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient.js"; +import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient.js"; +import { mergeHeaders, mergeOnlyDefinedHeaders } from "../../../../core/headers.js"; +import * as core from "../../../../core/index.js"; +import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError.js"; +import * as errors from "../../../../errors/index.js"; +import * as serializers from "../../../../serialization/index.js"; +import type * as SeedExhaustive from "../../../index.js"; + +export declare namespace ReqWithHeadersClient { + export type Options = BaseClientOptions; + + export interface RequestOptions extends BaseRequestOptions {} +} + +export class ReqWithHeadersClient { + protected readonly _options: NormalizedClientOptionsWithAuth; + + constructor(options: ReqWithHeadersClient.Options) { + this._options = normalizeClientOptionsWithAuth(options); + } + + /** + * @param {SeedExhaustive.ReqWithHeaders} request + * @param {ReqWithHeadersClient.RequestOptions} requestOptions - Request-specific configuration. + * + * @example + * await client.reqWithHeaders.getWithCustomHeader({ + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * }) + */ + public getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): core.HttpResponsePromise { + return core.HttpResponsePromise.fromPromise(this.__getWithCustomHeader(request, requestOptions)); + } + + private async __getWithCustomHeader( + request: SeedExhaustive.ReqWithHeaders, + requestOptions?: ReqWithHeadersClient.RequestOptions, + ): Promise> { + const { xTestServiceHeader, xTestEndpointHeader, body: _body } = request; + const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest(); + const _headers: core.Fetcher.Args["headers"] = mergeHeaders( + _authRequest.headers, + this._options?.headers, + mergeOnlyDefinedHeaders({ + "X-TEST-SERVICE-HEADER": xTestServiceHeader, + "X-TEST-ENDPOINT-HEADER": xTestEndpointHeader, + }), + requestOptions?.headers, + ); + const _response = await core.fetcher({ + url: core.url.join( + (await core.Supplier.get(this._options.baseUrl)) ?? + (await core.Supplier.get(this._options.environment)), + "/test-headers/custom-header", + ), + method: "POST", + headers: _headers, + contentType: "application/json", + queryParameters: requestOptions?.queryParams, + requestType: "json", + body: serializers.reqWithHeaders.getWithCustomHeader.Request.jsonOrThrow(_body, { + unrecognizedObjectKeys: "strip", + omitUndefined: true, + }), + timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000, + maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries, + abortSignal: requestOptions?.abortSignal, + fetchFn: this._options?.fetch, + logging: this._options.logging, + }); + if (_response.ok) { + return { data: undefined, rawResponse: _response.rawResponse }; + } + + if (_response.error.reason === "status-code") { + throw new errors.SeedExhaustiveError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + rawResponse: _response.rawResponse, + }); + } + + return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/test-headers/custom-header"); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts new file mode 100644 index 000000000000..b7fce3790bf5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/ReqWithHeaders.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * @example + * { + * xTestServiceHeader: "X-TEST-SERVICE-HEADER", + * xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + * body: "string" + * } + */ +export interface ReqWithHeaders { + xTestServiceHeader: string; + xTestEndpointHeader: string; + body: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts new file mode 100644 index 000000000000..5419b56cd667 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/client/requests/index.ts @@ -0,0 +1 @@ +export type { ReqWithHeaders } from "./ReqWithHeaders.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ed458c66ba3c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,66 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithDocs { + /** + * Characters that could lead to broken generated SDKs: + * + * Markdown Escapes: + * - \_: Escaped underscore (e.g., FOO\_BAR) + * - \*: Escaped asterisk + * + * JSDoc (JavaScript/TypeScript): + * - @: Used for JSDoc tags + * - {: }: Used for type definitions + * - <: >: HTML tags + * - *: Can interfere with comment blocks + * - /**: JSDoc comment start + * - ** /: JSDoc comment end + * - &: HTML entities + * + * XMLDoc (C#): + * - <: >: XML tags + * - &: ': ": <: >: XML special characters + * - {: }: Used for interpolated strings + * - ///: Comment marker + * - /**: Block comment start + * - ** /: Block comment end + * + * Javadoc (Java): + * - @: Used for Javadoc tags + * - <: >: HTML tags + * - &: HTML entities + * - *: Can interfere with comment blocks + * - /**: Javadoc comment start + * - ** /: Javadoc comment end + * + * Doxygen (C++): + * - \: Used for Doxygen commands + * - @: Alternative command prefix + * - <: >: XML/HTML tags + * - &: HTML entities + * - /**: C-style comment start + * - ** /: C-style comment end + * + * RDoc (Ruby): + * - :: Used in symbol notation + * - =: Section markers + * - #: Comment marker + * - =begin: Block comment start + * - =end: Block comment end + * - @: Instance variable prefix + * - $: Global variable prefix + * - %: String literal delimiter + * - #{: String interpolation start + * - }: String interpolation end + * + * PHPDoc (PHP): + * - @: Used for PHPDoc tags + * - {: }: Used for type definitions + * - $: Variable prefix + * - /**: PHPDoc comment start + * - ** /: PHPDoc comment end + * - *: Can interfere with comment blocks + * - &: HTML entities + */ + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts new file mode 100644 index 000000000000..ef1aee2d386e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/ErrorWithEnumBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithEnumBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.WeatherReport, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithEnumBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts new file mode 100644 index 000000000000..203651bfb712 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithEnumBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..4023a0068946 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export const WeatherReport = { + Sunny: "SUNNY", + Cloudy: "CLOUDY", + Raining: "RAINING", + Snowing: "SNOWING", +} as const; +export type WeatherReport = (typeof WeatherReport)[keyof typeof WeatherReport]; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts new file mode 100644 index 000000000000..c2a44b58ecd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/index.ts @@ -0,0 +1,11 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * from "./enum/errors/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * from "./object/errors/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * from "./union/errors/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..2681788e4f04 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..203710315112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/NestedObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class NestedObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.NestedObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "NestedObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts new file mode 100644 index 000000000000..230964f8467f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithOptionalFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithOptionalFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithOptionalField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithOptionalFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts new file mode 100644 index 000000000000..b8a86dc99dd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/ObjectWithRequiredFieldError.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ObjectWithRequiredFieldError extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.ObjectWithRequiredField, rawResponse?: core.RawResponse) { + super({ + message: "ObjectWithRequiredFieldError", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts new file mode 100644 index 000000000000..e38a83090455 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/errors/index.ts @@ -0,0 +1,4 @@ +export * from "./NestedObjectWithOptionalFieldError.js"; +export * from "./NestedObjectWithRequiredFieldError.js"; +export * from "./ObjectWithOptionalFieldError.js"; +export * from "./ObjectWithRequiredFieldError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..4898ba728836 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,7 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface DoubleOptional { + optionalAlias?: SeedExhaustive.types.OptionalAlias | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..324bb2e73908 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithOptionalField { + string?: string; + nestedObject?: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..322dcfbd5c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,8 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export interface NestedObjectWithRequiredField { + string: string; + nestedObject: SeedExhaustive.types.ObjectWithOptionalField; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..b35138a717bb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithMapOfMap { + map: Record>; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..2e6b3811b575 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithOptionalField { + /** This is a rather long descriptor of this single field in a more complex type. If you ask me I think this is a pretty good description for this field all things considered. */ + string?: string; + integer?: number; + long?: number; + double?: number; + bool?: boolean; + datetime?: Date; + date?: string; + uuid?: string; + base64?: string; + list?: string[]; + set?: Set; + map?: Record; + bigint?: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..032a84135c9e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,5 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface ObjectWithRequiredField { + string: string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..5dac5b761df8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,3 @@ +// This file was auto-generated by Fern from our API Definition. + +export type OptionalAlias = string | undefined; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts new file mode 100644 index 000000000000..c0e5b750495f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/ErrorWithUnionBody.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../../../../../../core/index.js"; +import * as errors from "../../../../../../errors/index.js"; +import type * as SeedExhaustive from "../../../../../index.js"; + +export class ErrorWithUnionBody extends errors.SeedExhaustiveError { + constructor(body: SeedExhaustive.types.Animal, rawResponse?: core.RawResponse) { + super({ + message: "ErrorWithUnionBody", + statusCode: 400, + body: body, + rawResponse: rawResponse, + }); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts new file mode 100644 index 000000000000..940b191924ee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/errors/index.ts @@ -0,0 +1 @@ +export * from "./ErrorWithUnionBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..38688e58bd6f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/index.ts @@ -0,0 +1,2 @@ +export * from "./errors/index.js"; +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..f5336c6b33bc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../index.js"; + +export type Animal = SeedExhaustive.types.Animal.Dog | SeedExhaustive.types.Animal.Cat; + +export namespace Animal { + export interface Dog extends SeedExhaustive.types.Dog { + animal: "dog"; + } + + export interface Cat extends SeedExhaustive.types.Cat { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..aa74d5b7dd01 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Cat { + name: string; + likesToMeow: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..24bc9aa321b1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,6 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface Dog { + name: string; + likesToWoof: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/api/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts new file mode 100644 index 000000000000..95ada392f8de --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/BearerAuthProvider.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../core/index.js"; +import * as errors from "../errors/index.js"; + +export namespace BearerAuthProvider { + export interface AuthOptions { + token?: core.Supplier; + } + + export interface Options extends AuthOptions {} +} + +export class BearerAuthProvider implements core.AuthProvider { + private readonly token: core.Supplier | undefined; + + constructor(options: BearerAuthProvider.Options) { + this.token = options.token; + } + + public static canCreate(options: BearerAuthProvider.Options): boolean { + return options.token != null; + } + + public async getAuthRequest(_arg?: { endpointMetadata?: core.EndpointMetadata }): Promise { + const token = await core.Supplier.get(this.token); + if (token == null) { + throw new errors.SeedExhaustiveError({ + message: "Please specify a token by passing it in to the constructor", + }); + } + + return { + headers: { Authorization: `Bearer ${token}` }, + }; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts new file mode 100644 index 000000000000..0ecb12b79bdb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/auth/index.ts @@ -0,0 +1 @@ +export { BearerAuthProvider } from "./BearerAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts new file mode 100644 index 000000000000..895a50ff30da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthProvider.ts @@ -0,0 +1,6 @@ +import type { EndpointMetadata } from "../fetcher/EndpointMetadata.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export interface AuthProvider { + getAuthRequest(arg?: { endpointMetadata?: EndpointMetadata }): Promise; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts new file mode 100644 index 000000000000..f6218b42211e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/AuthRequest.ts @@ -0,0 +1,9 @@ +/** + * Request parameters for authentication requests. + */ +export interface AuthRequest { + /** + * The headers to be included in the request. + */ + headers: Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts new file mode 100644 index 000000000000..a64235910062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BasicAuth.ts @@ -0,0 +1,32 @@ +import { base64Decode, base64Encode } from "../base64.js"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = base64Encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = base64Decode(credentials); + const [username, ...passwordParts] = decoded.split(":"); + const password = passwordParts.length > 0 ? passwordParts.join(":") : undefined; + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts new file mode 100644 index 000000000000..c44a06c38f06 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/BearerToken.ts @@ -0,0 +1,20 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +function toAuthorizationHeader(token: string | undefined): string | undefined { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; +} + +export const BearerToken: { + toAuthorizationHeader: typeof toAuthorizationHeader; + fromAuthorizationHeader: (header: string) => BearerToken; +} = { + toAuthorizationHeader: toAuthorizationHeader, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts new file mode 100644 index 000000000000..5b7acfd2bd8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/NoOpAuthProvider.ts @@ -0,0 +1,8 @@ +import type { AuthProvider } from "./AuthProvider.js"; +import type { AuthRequest } from "./AuthRequest.js"; + +export class NoOpAuthProvider implements AuthProvider { + public getAuthRequest(): Promise { + return Promise.resolve({ headers: {} }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts new file mode 100644 index 000000000000..2215b227709e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/auth/index.ts @@ -0,0 +1,5 @@ +export type { AuthProvider } from "./AuthProvider.js"; +export type { AuthRequest } from "./AuthRequest.js"; +export { BasicAuth } from "./BasicAuth.js"; +export { BearerToken } from "./BearerToken.js"; +export { NoOpAuthProvider } from "./NoOpAuthProvider.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts new file mode 100644 index 000000000000..448a0db638a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/base64.ts @@ -0,0 +1,27 @@ +function base64ToBytes(base64: string): Uint8Array { + const binString = atob(base64); + return Uint8Array.from(binString, (m) => m.codePointAt(0)!); +} + +function bytesToBase64(bytes: Uint8Array): string { + const binString = String.fromCodePoint(...bytes); + return btoa(binString); +} + +export function base64Encode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "utf8").toString("base64"); + } + + const bytes = new TextEncoder().encode(input); + return bytesToBase64(bytes); +} + +export function base64Decode(input: string): string { + if (typeof Buffer !== "undefined") { + return Buffer.from(input, "base64").toString("utf8"); + } + + const bytes = base64ToBytes(input); + return new TextDecoder().decode(bytes); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts new file mode 100644 index 000000000000..69296d7100d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/exports.ts @@ -0,0 +1 @@ +export * from "./logging/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts new file mode 100644 index 000000000000..97ab83c2b195 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/APIResponse.ts @@ -0,0 +1,23 @@ +import type { RawResponse } from "./RawResponse.js"; + +/** + * The response of an API call. + * It is a successful response or a failed response. + */ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; + /** + * @deprecated Use `rawResponse` instead + */ + headers?: Record; + rawResponse: RawResponse; +} + +export interface FailedResponse { + ok: false; + error: T; + rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts new file mode 100644 index 000000000000..bca7f4c77981 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/BinaryResponse.ts @@ -0,0 +1,34 @@ +export type BinaryResponse = { + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed) */ + bodyUsed: Response["bodyUsed"]; + /** + * Returns a ReadableStream of the response body. + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body) + */ + stream: () => Response["body"]; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer) */ + arrayBuffer: () => ReturnType; + /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob) */ + blob: () => ReturnType; + /** + * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes) + * Some versions of the Fetch API may not support this method. + */ + bytes?(): ReturnType; +}; + +export function getBinaryResponse(response: Response): BinaryResponse { + const binaryResponse: BinaryResponse = { + get bodyUsed() { + return response.bodyUsed; + }, + stream: () => response.body, + arrayBuffer: response.arrayBuffer.bind(response), + blob: response.blob.bind(response), + }; + if ("bytes" in response && typeof response.bytes === "function") { + binaryResponse.bytes = response.bytes.bind(response); + } + + return binaryResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts new file mode 100644 index 000000000000..998d68f5c20c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointMetadata.ts @@ -0,0 +1,13 @@ +export type SecuritySchemeKey = string; +/** + * A collection of security schemes, where the key is the name of the security scheme and the value is the list of scopes required for that scheme. + * All schemes in the collection must be satisfied for authentication to be successful. + */ +export type SecuritySchemeCollection = Record; +export type AuthScope = string; +export type EndpointMetadata = { + /** + * An array of security scheme collections. Each collection represents an alternative way to authenticate. + */ + security?: SecuritySchemeCollection[]; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts new file mode 100644 index 000000000000..8079841c4062 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/EndpointSupplier.ts @@ -0,0 +1,14 @@ +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import type { Supplier } from "./Supplier.js"; + +type EndpointSupplierFn = (arg: { endpointMetadata: EndpointMetadata }) => T | Promise; +export type EndpointSupplier = Supplier | EndpointSupplierFn; +export const EndpointSupplier = { + get: async (supplier: EndpointSupplier, arg: { endpointMetadata: EndpointMetadata }): Promise => { + if (typeof supplier === "function") { + return (supplier as EndpointSupplierFn)(arg); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts new file mode 100644 index 000000000000..58bb0e3ef7d9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Fetcher.ts @@ -0,0 +1,391 @@ +import { toJson } from "../json.js"; +import { createLogger, type LogConfig, type Logger } from "../logging/logger.js"; +import type { APIResponse } from "./APIResponse.js"; +import { createRequestUrl } from "./createRequestUrl.js"; +import type { EndpointMetadata } from "./EndpointMetadata.js"; +import { EndpointSupplier } from "./EndpointSupplier.js"; +import { getErrorResponseBody } from "./getErrorResponseBody.js"; +import { getFetchFn } from "./getFetchFn.js"; +import { getRequestBody } from "./getRequestBody.js"; +import { getResponseBody } from "./getResponseBody.js"; +import { Headers } from "./Headers.js"; +import { makeRequest } from "./makeRequest.js"; +import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +import { requestWithRetries } from "./requestWithRetries.js"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record | null | undefined>; + queryParameters?: Record; + body?: unknown; + timeoutMs?: number; + maxRetries?: number; + withCredentials?: boolean; + abortSignal?: AbortSignal; + requestType?: "json" | "file" | "bytes" | "form" | "other"; + responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response"; + duplex?: "half"; + endpointMetadata?: EndpointMetadata; + fetchFn?: typeof fetch; + logging?: LogConfig | Logger; + } + + export type Error = FailedStatusCodeError | NonJsonError | BodyIsNullError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface BodyIsNullError { + reason: "body-is-null"; + statusCode: number; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +const SENSITIVE_HEADERS = new Set([ + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "cookie", + "set-cookie", + "proxy-authorization", + "proxy-authenticate", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token", +]); + +function redactHeaders(headers: Headers | Record): Record { + const filtered: Record = {}; + for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) { + if (SENSITIVE_HEADERS.has(key.toLowerCase())) { + filtered[key] = "[REDACTED]"; + } else { + filtered[key] = value; + } + } + return filtered; +} + +const SENSITIVE_QUERY_PARAMS = new Set([ + "api_key", + "api-key", + "apikey", + "token", + "access_token", + "access-token", + "auth_token", + "auth-token", + "password", + "passwd", + "secret", + "api_secret", + "api-secret", + "apisecret", + "key", + "session", + "session_id", + "session-id", +]); + +function redactQueryParameters(queryParameters?: Record): Record | undefined { + if (queryParameters == null) { + return queryParameters; + } + const redacted: Record = {}; + for (const [key, value] of Object.entries(queryParameters)) { + if (SENSITIVE_QUERY_PARAMS.has(key.toLowerCase())) { + redacted[key] = "[REDACTED]"; + } else { + redacted[key] = value; + } + } + return redacted; +} + +function redactUrl(url: string): string { + const protocolIndex = url.indexOf("://"); + if (protocolIndex === -1) return url; + + const afterProtocol = protocolIndex + 3; + + // Find the first delimiter that marks the end of the authority section + const pathStart = url.indexOf("/", afterProtocol); + let queryStart = url.indexOf("?", afterProtocol); + let fragmentStart = url.indexOf("#", afterProtocol); + + const firstDelimiter = Math.min( + pathStart === -1 ? url.length : pathStart, + queryStart === -1 ? url.length : queryStart, + fragmentStart === -1 ? url.length : fragmentStart, + ); + + // Find the LAST @ before the delimiter (handles multiple @ in credentials) + let atIndex = -1; + for (let i = afterProtocol; i < firstDelimiter; i++) { + if (url[i] === "@") { + atIndex = i; + } + } + + if (atIndex !== -1) { + url = `${url.slice(0, afterProtocol)}[REDACTED]@${url.slice(atIndex + 1)}`; + } + + // Recalculate queryStart since url might have changed + queryStart = url.indexOf("?"); + if (queryStart === -1) return url; + + fragmentStart = url.indexOf("#", queryStart); + const queryEnd = fragmentStart !== -1 ? fragmentStart : url.length; + const queryString = url.slice(queryStart + 1, queryEnd); + + if (queryString.length === 0) return url; + + // FAST PATH: Quick check if any sensitive keywords present + // Using indexOf is faster than regex for simple substring matching + const lower = queryString.toLowerCase(); + const hasSensitive = + lower.includes("token") || + lower.includes("key") || + lower.includes("password") || + lower.includes("passwd") || + lower.includes("secret") || + lower.includes("session") || + lower.includes("auth"); + + if (!hasSensitive) { + return url; + } + + // SLOW PATH: Parse and redact + const redactedParams: string[] = []; + const params = queryString.split("&"); + + for (const param of params) { + const equalIndex = param.indexOf("="); + if (equalIndex === -1) { + redactedParams.push(param); + continue; + } + + const key = param.slice(0, equalIndex); + let shouldRedact = SENSITIVE_QUERY_PARAMS.has(key.toLowerCase()); + + if (!shouldRedact && key.includes("%")) { + try { + const decodedKey = decodeURIComponent(key); + shouldRedact = SENSITIVE_QUERY_PARAMS.has(decodedKey.toLowerCase()); + } catch {} + } + + redactedParams.push(shouldRedact ? `${key}=[REDACTED]` : param); + } + + return url.slice(0, queryStart + 1) + redactedParams.join("&") + url.slice(queryEnd); +} + +async function getHeaders(args: Fetcher.Args): Promise { + const newHeaders: Headers = new Headers(); + + newHeaders.set( + "Accept", + args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : "*/*", + ); + if (args.body !== undefined && args.contentType != null) { + newHeaders.set("Content-Type", args.contentType); + } + + if (args.headers == null) { + return newHeaders; + } + + for (const [key, value] of Object.entries(args.headers)) { + const result = await EndpointSupplier.get(value, { endpointMetadata: args.endpointMetadata ?? {} }); + if (typeof result === "string") { + newHeaders.set(key, result); + continue; + } + if (result == null) { + continue; + } + newHeaders.set(key, `${result}`); + } + return newHeaders; +} + +export async function fetcherImpl(args: Fetcher.Args): Promise> { + const url = createRequestUrl(args.url, args.queryParameters); + const requestBody: BodyInit | undefined = await getRequestBody({ + body: args.body, + type: args.requestType ?? "other", + }); + const fetchFn = args.fetchFn ?? (await getFetchFn()); + const headers = await getHeaders(args); + const logger = createLogger(args.logging); + + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + headers: redactHeaders(headers), + queryParameters: redactQueryParameters(args.queryParameters), + hasBody: requestBody != null, + }; + logger.debug("Making HTTP request", metadata); + } + + try { + const response = await requestWithRetries( + async () => + makeRequest( + fetchFn, + url, + args.method, + headers, + requestBody, + args.timeoutMs, + args.abortSignal, + args.withCredentials, + args.duplex, + ), + args.maxRetries, + ); + + if (response.status >= 200 && response.status < 400) { + if (logger.isDebug()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(response.headers), + }; + logger.debug("HTTP request succeeded", metadata); + } + const body = await getResponseBody(response, args.responseType); + return { + ok: true, + body: body as R, + headers: response.headers, + rawResponse: toRawResponse(response), + }; + } else { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + statusCode: response.status, + responseHeaders: redactHeaders(Object.fromEntries(response.headers.entries())), + }; + logger.error("HTTP request failed with error status", metadata); + } + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body: await getErrorResponseBody(response), + }, + rawResponse: toRawResponse(response), + }; + } + } catch (error) { + if (args.abortSignal?.aborted) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + }; + logger.error("HTTP request was aborted", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: "The user aborted a request", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error && error.name === "AbortError") { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + timeoutMs: args.timeoutMs, + }; + logger.error("HTTP request timed out", metadata); + } + return { + ok: false, + error: { + reason: "timeout", + }, + rawResponse: abortRawResponse, + }; + } else if (error instanceof Error) { + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + errorMessage: error.message, + }; + logger.error("HTTP request failed with error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: error.message, + }, + rawResponse: unknownRawResponse, + }; + } + + if (logger.isError()) { + const metadata = { + method: args.method, + url: redactUrl(url), + error: toJson(error), + }; + logger.error("HTTP request failed with unknown error", metadata); + } + return { + ok: false, + error: { + reason: "unknown", + errorMessage: toJson(error), + }, + rawResponse: unknownRawResponse, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts new file mode 100644 index 000000000000..af841aa24f55 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Headers.ts @@ -0,0 +1,93 @@ +let Headers: typeof globalThis.Headers; + +if (typeof globalThis.Headers !== "undefined") { + Headers = globalThis.Headers; +} else { + Headers = class Headers implements Headers { + private headers: Map; + + constructor(init?: HeadersInit) { + this.headers = new Map(); + + if (init) { + if (init instanceof Headers) { + init.forEach((value, key) => this.append(key, value)); + } else if (Array.isArray(init)) { + for (const [key, value] of init) { + if (typeof key === "string" && typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Each header entry must be a [string, string] tuple"); + } + } + } else { + for (const [key, value] of Object.entries(init)) { + if (typeof value === "string") { + this.append(key, value); + } else { + throw new TypeError("Header values must be strings"); + } + } + } + } + } + + append(name: string, value: string): void { + const key = name.toLowerCase(); + const existing = this.headers.get(key) || []; + this.headers.set(key, [...existing, value]); + } + + delete(name: string): void { + const key = name.toLowerCase(); + this.headers.delete(key); + } + + get(name: string): string | null { + const key = name.toLowerCase(); + const values = this.headers.get(key); + return values ? values.join(", ") : null; + } + + has(name: string): boolean { + const key = name.toLowerCase(); + return this.headers.has(key); + } + + set(name: string, value: string): void { + const key = name.toLowerCase(); + this.headers.set(key, [value]); + } + + forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: unknown): void { + const boundCallback = thisArg ? callbackfn.bind(thisArg) : callbackfn; + this.headers.forEach((values, key) => boundCallback(values.join(", "), key, this)); + } + + getSetCookie(): string[] { + return this.headers.get("set-cookie") || []; + } + + *entries(): HeadersIterator<[string, string]> { + for (const [key, values] of this.headers.entries()) { + yield [key, values.join(", ")]; + } + } + + *keys(): HeadersIterator { + yield* this.headers.keys(); + } + + *values(): HeadersIterator { + for (const values of this.headers.values()) { + yield values.join(", "); + } + } + + [Symbol.iterator](): HeadersIterator<[string, string]> { + return this.entries(); + } + }; +} + +export { Headers }; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts new file mode 100644 index 000000000000..692ca7d795f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/HttpResponsePromise.ts @@ -0,0 +1,116 @@ +import type { WithRawResponse } from "./RawResponse.js"; + +/** + * A promise that returns the parsed response and lets you retrieve the raw response too. + */ +export class HttpResponsePromise extends Promise { + private innerPromise: Promise>; + private unwrappedPromise: Promise | undefined; + + private constructor(promise: Promise>) { + // Initialize with a no-op to avoid premature parsing + super((resolve) => { + resolve(undefined as unknown as T); + }); + this.innerPromise = promise; + } + + /** + * Creates an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @param args - Arguments to pass to the function. + * @returns An `HttpResponsePromise` instance. + */ + public static fromFunction Promise>, T>( + fn: F, + ...args: Parameters + ): HttpResponsePromise { + return new HttpResponsePromise(fn(...args)); + } + + /** + * Creates a function that returns an `HttpResponsePromise` from a function that returns a promise. + * + * @param fn - A function that returns a promise resolving to a `WithRawResponse` object. + * @returns A function that returns an `HttpResponsePromise` instance. + */ + public static interceptFunction< + F extends (...args: never[]) => Promise>, + T = Awaited>["data"], + >(fn: F): (...args: Parameters) => HttpResponsePromise { + return (...args: Parameters): HttpResponsePromise => { + return HttpResponsePromise.fromPromise(fn(...args)); + }; + } + + /** + * Creates an `HttpResponsePromise` from an existing promise. + * + * @param promise - A promise resolving to a `WithRawResponse` object. + * @returns An `HttpResponsePromise` instance. + */ + public static fromPromise(promise: Promise>): HttpResponsePromise { + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from an executor function. + * + * @param executor - A function that takes resolve and reject callbacks to create a promise. + * @returns An `HttpResponsePromise` instance. + */ + public static fromExecutor( + executor: (resolve: (value: WithRawResponse) => void, reject: (reason?: unknown) => void) => void, + ): HttpResponsePromise { + const promise = new Promise>(executor); + return new HttpResponsePromise(promise); + } + + /** + * Creates an `HttpResponsePromise` from a resolved result. + * + * @param result - A `WithRawResponse` object to resolve immediately. + * @returns An `HttpResponsePromise` instance. + */ + public static fromResult(result: WithRawResponse): HttpResponsePromise { + const promise = Promise.resolve(result); + return new HttpResponsePromise(promise); + } + + private unwrap(): Promise { + if (!this.unwrappedPromise) { + this.unwrappedPromise = this.innerPromise.then(({ data }) => data); + } + return this.unwrappedPromise; + } + + /** @inheritdoc */ + public override then( + onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + ): Promise { + return this.unwrap().then(onfulfilled, onrejected); + } + + /** @inheritdoc */ + public override catch( + onrejected?: ((reason: unknown) => TResult | PromiseLike) | null, + ): Promise { + return this.unwrap().catch(onrejected); + } + + /** @inheritdoc */ + public override finally(onfinally?: (() => void) | null): Promise { + return this.unwrap().finally(onfinally); + } + + /** + * Retrieves the data and raw response. + * + * @returns A promise resolving to a `WithRawResponse` object. + */ + public async withRawResponse(): Promise> { + return await this.innerPromise; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts new file mode 100644 index 000000000000..37fb44e2aa99 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/RawResponse.ts @@ -0,0 +1,61 @@ +import { Headers } from "./Headers.js"; + +/** + * The raw response from the fetch call excluding the body. + */ +export type RawResponse = Omit< + { + [K in keyof Response as Response[K] extends Function ? never : K]: Response[K]; // strips out functions + }, + "ok" | "body" | "bodyUsed" +>; // strips out body and bodyUsed + +/** + * A raw response indicating that the request was aborted. + */ +export const abortRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 499, + statusText: "Client Closed Request", + type: "error", + url: "", +} as const; + +/** + * A raw response indicating an unknown error. + */ +export const unknownRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 0, + statusText: "Unknown Error", + type: "error", + url: "", +} as const; + +/** + * Converts a `RawResponse` object into a `RawResponse` by extracting its properties, + * excluding the `body` and `bodyUsed` fields. + * + * @param response - The `RawResponse` object to convert. + * @returns A `RawResponse` object containing the extracted properties of the input response. + */ +export function toRawResponse(response: Response): RawResponse { + return { + headers: response.headers, + redirected: response.redirected, + status: response.status, + statusText: response.statusText, + type: response.type, + url: response.url, + }; +} + +/** + * Creates a `RawResponse` from a standard `Response` object. + */ +export interface WithRawResponse { + readonly data: T; + readonly rawResponse: RawResponse; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts new file mode 100644 index 000000000000..867c931c02f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts new file mode 100644 index 000000000000..88e13265e112 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/createRequestUrl.ts @@ -0,0 +1,6 @@ +import { toQueryString } from "../url/qs.js"; + +export function createRequestUrl(baseUrl: string, queryParameters?: Record): string { + const queryString = toQueryString(queryParameters, { arrayFormat: "repeat" }); + return queryString ? `${baseUrl}?${queryString}` : baseUrl; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts new file mode 100644 index 000000000000..7cf4e623c2f5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getErrorResponseBody.ts @@ -0,0 +1,33 @@ +import { fromJson } from "../json.js"; +import { getResponseBody } from "./getResponseBody.js"; + +export async function getErrorResponseBody(response: Response): Promise { + let contentType = response.headers.get("Content-Type")?.toLowerCase(); + if (contentType == null || contentType.length === 0) { + return getResponseBody(response); + } + + if (contentType.indexOf(";") !== -1) { + contentType = contentType.split(";")[0]?.trim() ?? ""; + } + switch (contentType) { + case "application/hal+json": + case "application/json": + case "application/ld+json": + case "application/problem+json": + case "application/vnd.api+json": + case "text/json": { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + default: + if (contentType.startsWith("application/vnd.") && contentType.endsWith("+json")) { + const text = await response.text(); + return text.length > 0 ? fromJson(text) : undefined; + } + + // Fallback to plain text if content type is not recognized + // Even if no body is present, the response will be an empty string + return await response.text(); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts new file mode 100644 index 000000000000..9f845b956392 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getFetchFn.ts @@ -0,0 +1,3 @@ +export async function getFetchFn(): Promise { + return fetch; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts new file mode 100644 index 000000000000..50f922b0e87f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getHeader.ts @@ -0,0 +1,8 @@ +export function getHeader(headers: Record, header: string): string | undefined { + for (const [headerKey, headerValue] of Object.entries(headers)) { + if (headerKey.toLowerCase() === header.toLowerCase()) { + return headerValue; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts new file mode 100644 index 000000000000..91d9d81f50e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getRequestBody.ts @@ -0,0 +1,20 @@ +import { toJson } from "../json.js"; +import { toQueryString } from "../url/qs.js"; + +export declare namespace GetRequestBody { + interface Args { + body: unknown; + type: "json" | "file" | "bytes" | "form" | "other"; + } +} + +export async function getRequestBody({ body, type }: GetRequestBody.Args): Promise { + if (type === "form") { + return toQueryString(body, { arrayFormat: "repeat", encode: true }); + } + if (type.includes("json")) { + return toJson(body); + } else { + return body as BodyInit; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts new file mode 100644 index 000000000000..708d55728f2b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/getResponseBody.ts @@ -0,0 +1,58 @@ +import { fromJson } from "../json.js"; +import { getBinaryResponse } from "./BinaryResponse.js"; + +export async function getResponseBody(response: Response, responseType?: string): Promise { + switch (responseType) { + case "binary-response": + return getBinaryResponse(response); + case "blob": + return await response.blob(); + case "arrayBuffer": + return await response.arrayBuffer(); + case "sse": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + return response.body; + case "streaming": + if (response.body == null) { + return { + ok: false, + error: { + reason: "body-is-null", + statusCode: response.status, + }, + }; + } + + return response.body; + + case "text": + return await response.text(); + } + + // if responseType is "json" or not specified, try to parse as JSON + const text = await response.text(); + if (text.length > 0) { + try { + const responseBody = fromJson(text); + return responseBody; + } catch (_err) { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: text, + }, + }; + } + } + return undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts new file mode 100644 index 000000000000..c3bc6da20f49 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/index.ts @@ -0,0 +1,11 @@ +export type { APIResponse } from "./APIResponse.js"; +export type { BinaryResponse } from "./BinaryResponse.js"; +export type { EndpointMetadata } from "./EndpointMetadata.js"; +export { EndpointSupplier } from "./EndpointSupplier.js"; +export type { Fetcher, FetchFunction } from "./Fetcher.js"; +export { fetcher } from "./Fetcher.js"; +export { getHeader } from "./getHeader.js"; +export { HttpResponsePromise } from "./HttpResponsePromise.js"; +export type { RawResponse, WithRawResponse } from "./RawResponse.js"; +export { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.js"; +export { Supplier } from "./Supplier.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts new file mode 100644 index 000000000000..921565eb0063 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/makeRequest.ts @@ -0,0 +1,42 @@ +import { anySignal, getTimeoutSignal } from "./signals.js"; + +export const makeRequest = async ( + fetchFn: (url: string, init: RequestInit) => Promise, + url: string, + method: string, + headers: Headers | Record, + requestBody: BodyInit | undefined, + timeoutMs?: number, + abortSignal?: AbortSignal, + withCredentials?: boolean, + duplex?: "half", +): Promise => { + const signals: AbortSignal[] = []; + + let timeoutAbortId: ReturnType | undefined; + if (timeoutMs != null) { + const { signal, abortId } = getTimeoutSignal(timeoutMs); + timeoutAbortId = abortId; + signals.push(signal); + } + + if (abortSignal != null) { + signals.push(abortSignal); + } + const newSignals = anySignal(signals); + const response = await fetchFn(url, { + method: method, + headers, + body: requestBody, + signal: newSignals, + credentials: withCredentials ? "include" : undefined, + // @ts-ignore + duplex, + }); + + if (timeoutAbortId != null) { + clearTimeout(timeoutAbortId); + } + + return response; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts new file mode 100644 index 000000000000..1f689688c4b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/requestWithRetries.ts @@ -0,0 +1,64 @@ +const INITIAL_RETRY_DELAY = 1000; // in milliseconds +const MAX_RETRY_DELAY = 60000; // in milliseconds +const DEFAULT_MAX_RETRIES = 2; +const JITTER_FACTOR = 0.2; // 20% random jitter + +function addPositiveJitter(delay: number): number { + const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function addSymmetricJitter(delay: number): number { + const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR; + return delay * jitterMultiplier; +} + +function getRetryDelayFromHeaders(response: Response, retryAttempt: number): number { + const retryAfter = response.headers.get("Retry-After"); + if (retryAfter) { + const retryAfterSeconds = parseInt(retryAfter, 10); + if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) { + return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY); + } + + const retryAfterDate = new Date(retryAfter); + if (!Number.isNaN(retryAfterDate.getTime())) { + const delay = retryAfterDate.getTime() - Date.now(); + if (delay > 0) { + return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY); + } + } + } + + const rateLimitReset = response.headers.get("X-RateLimit-Reset"); + if (rateLimitReset) { + const resetTime = parseInt(rateLimitReset, 10); + if (!Number.isNaN(resetTime)) { + const delay = resetTime * 1000 - Date.now(); + if (delay > 0) { + return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY)); + } + } + } + + return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * 2 ** retryAttempt, MAX_RETRY_DELAY)); +} + +export async function requestWithRetries( + requestFn: () => Promise, + maxRetries: number = DEFAULT_MAX_RETRIES, +): Promise { + let response: Response = await requestFn(); + + for (let i = 0; i < maxRetries; ++i) { + if ([408, 429].includes(response.status) || response.status >= 500) { + const delay = getRetryDelayFromHeaders(response, i); + + await new Promise((resolve) => setTimeout(resolve, delay)); + response = await requestFn(); + } else { + break; + } + } + return response!; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts new file mode 100644 index 000000000000..7bd3757ec3a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/fetcher/signals.ts @@ -0,0 +1,26 @@ +const TIMEOUT = "timeout"; + +export function getTimeoutSignal(timeoutMs: number): { signal: AbortSignal; abortId: ReturnType } { + const controller = new AbortController(); + const abortId = setTimeout(() => controller.abort(TIMEOUT), timeoutMs); + return { signal: controller.signal, abortId }; +} + +export function anySignal(...args: AbortSignal[] | [AbortSignal[]]): AbortSignal { + const signals = (args.length === 1 && Array.isArray(args[0]) ? args[0] : args) as AbortSignal[]; + + const controller = new AbortController(); + + for (const signal of signals) { + if (signal.aborted) { + controller.abort((signal as any)?.reason); + break; + } + + signal.addEventListener("abort", () => controller.abort((signal as any)?.reason), { + signal: controller.signal, + }); + } + + return controller.signal; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts new file mode 100644 index 000000000000..78ed8b500c95 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/headers.ts @@ -0,0 +1,35 @@ +export function mergeHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } else if (insensitiveKey in result) { + delete result[insensitiveKey]; + } + } + + return result; +} + +export function mergeOnlyDefinedHeaders( + ...headersArray: (Record | null | undefined)[] +): Record { + const result: Record = {}; + + for (const [key, value] of headersArray + .filter((headers) => headers != null) + .flatMap((headers) => Object.entries(headers))) { + const insensitiveKey = key.toLowerCase(); + if (value != null) { + result[insensitiveKey] = value; + } + } + + return result; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts new file mode 100644 index 000000000000..874173e71808 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/index.ts @@ -0,0 +1,7 @@ +export * from "./auth/index.js"; +export * from "./base64.js"; +export * from "./fetcher/index.js"; +export * as logging from "./logging/index.js"; +export * from "./runtime/index.js"; +export * as serialization from "./schemas/index.js"; +export * as url from "./url/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts new file mode 100644 index 000000000000..c052f3249f4f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/json.ts @@ -0,0 +1,27 @@ +/** + * Serialize a value to JSON + * @param value A JavaScript value, usually an object or array, to be converted. + * @param replacer A function that transforms the results. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. + * @returns JSON string + */ +export const toJson = ( + value: unknown, + replacer?: (this: unknown, key: string, value: unknown) => unknown, + space?: string | number, +): string => { + return JSON.stringify(value, replacer, space); +}; + +/** + * Parse JSON string to object, array, or other type + * @param text A valid JSON string. + * @param reviver A function that transforms the results. This function is called for each member of the object. If a member contains nested objects, the nested objects are transformed before the parent object is. + * @returns Parsed object, array, or other type + */ +export function fromJson( + text: string, + reviver?: (this: unknown, key: string, value: unknown) => unknown, +): T { + return JSON.parse(text, reviver); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts new file mode 100644 index 000000000000..88f6c00db0cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/exports.ts @@ -0,0 +1,19 @@ +import * as logger from "./logger.js"; + +export namespace logging { + /** + * Configuration for logger instances. + */ + export type LogConfig = logger.LogConfig; + export type LogLevel = logger.LogLevel; + export const LogLevel: typeof logger.LogLevel = logger.LogLevel; + export type ILogger = logger.ILogger; + /** + * Console logger implementation that outputs to the console. + */ + export type ConsoleLogger = logger.ConsoleLogger; + /** + * Console logger implementation that outputs to the console. + */ + export const ConsoleLogger: typeof logger.ConsoleLogger = logger.ConsoleLogger; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts new file mode 100644 index 000000000000..d81cc32c40f9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/index.ts @@ -0,0 +1 @@ +export * from "./logger.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts new file mode 100644 index 000000000000..a3f3673cda93 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/logging/logger.ts @@ -0,0 +1,203 @@ +export const LogLevel = { + Debug: "debug", + Info: "info", + Warn: "warn", + Error: "error", +} as const; +export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]; +const logLevelMap: Record = { + [LogLevel.Debug]: 1, + [LogLevel.Info]: 2, + [LogLevel.Warn]: 3, + [LogLevel.Error]: 4, +}; + +export interface ILogger { + /** + * Logs a debug message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + debug(message: string, ...args: unknown[]): void; + /** + * Logs an info message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + info(message: string, ...args: unknown[]): void; + /** + * Logs a warning message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + warn(message: string, ...args: unknown[]): void; + /** + * Logs an error message. + * @param message - The message to log + * @param args - Additional arguments to log + */ + error(message: string, ...args: unknown[]): void; +} + +/** + * Configuration for logger initialization. + */ +export interface LogConfig { + /** + * Minimum log level to output. + * @default LogLevel.Info + */ + level?: LogLevel; + /** + * Logger implementation to use. + * @default new ConsoleLogger() + */ + logger?: ILogger; + /** + * Whether logging should be silenced. + * @default true + */ + silent?: boolean; +} + +/** + * Default console-based logger implementation. + */ +export class ConsoleLogger implements ILogger { + debug(message: string, ...args: unknown[]): void { + console.debug(message, ...args); + } + info(message: string, ...args: unknown[]): void { + console.info(message, ...args); + } + warn(message: string, ...args: unknown[]): void { + console.warn(message, ...args); + } + error(message: string, ...args: unknown[]): void { + console.error(message, ...args); + } +} + +/** + * Logger class that provides level-based logging functionality. + */ +export class Logger { + private readonly level: number; + private readonly logger: ILogger; + private readonly silent: boolean; + + /** + * Creates a new logger instance. + * @param config - Logger configuration + */ + constructor(config: Required) { + this.level = logLevelMap[config.level]; + this.logger = config.logger; + this.silent = config.silent; + } + + /** + * Checks if a log level should be output based on configuration. + * @param level - The log level to check + * @returns True if the level should be logged + */ + public shouldLog(level: LogLevel): boolean { + return !this.silent && this.level <= logLevelMap[level]; + } + + /** + * Checks if debug logging is enabled. + * @returns True if debug logs should be output + */ + public isDebug(): boolean { + return this.shouldLog(LogLevel.Debug); + } + + /** + * Logs a debug message if debug logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public debug(message: string, ...args: unknown[]): void { + if (this.isDebug()) { + this.logger.debug(message, ...args); + } + } + + /** + * Checks if info logging is enabled. + * @returns True if info logs should be output + */ + public isInfo(): boolean { + return this.shouldLog(LogLevel.Info); + } + + /** + * Logs an info message if info logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public info(message: string, ...args: unknown[]): void { + if (this.isInfo()) { + this.logger.info(message, ...args); + } + } + + /** + * Checks if warning logging is enabled. + * @returns True if warning logs should be output + */ + public isWarn(): boolean { + return this.shouldLog(LogLevel.Warn); + } + + /** + * Logs a warning message if warning logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public warn(message: string, ...args: unknown[]): void { + if (this.isWarn()) { + this.logger.warn(message, ...args); + } + } + + /** + * Checks if error logging is enabled. + * @returns True if error logs should be output + */ + public isError(): boolean { + return this.shouldLog(LogLevel.Error); + } + + /** + * Logs an error message if error logging is enabled. + * @param message - The message to log + * @param args - Additional arguments to log + */ + public error(message: string, ...args: unknown[]): void { + if (this.isError()) { + this.logger.error(message, ...args); + } + } +} + +export function createLogger(config?: LogConfig | Logger): Logger { + if (config == null) { + return defaultLogger; + } + if (config instanceof Logger) { + return config; + } + config = config ?? {}; + config.level ??= LogLevel.Info; + config.logger ??= new ConsoleLogger(); + config.silent ??= true; + return new Logger(config as Required); +} + +const defaultLogger: Logger = new Logger({ + level: LogLevel.Info, + logger: new ConsoleLogger(), + silent: true, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts new file mode 100644 index 000000000000..cfab23f9a834 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/index.ts @@ -0,0 +1 @@ +export { RUNTIME } from "./runtime.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts new file mode 100644 index 000000000000..56ebbb87c4d3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/runtime/runtime.ts @@ -0,0 +1,134 @@ +interface DenoGlobal { + version: { + deno: string; + }; +} + +interface BunGlobal { + version: string; +} + +declare const Deno: DenoGlobal | undefined; +declare const Bun: BunGlobal | undefined; +declare const EdgeRuntime: string | undefined; +declare const self: typeof globalThis.self & { + importScripts?: unknown; +}; + +/** + * A constant that indicates which environment and version the SDK is running in. + */ +export const RUNTIME: Runtime = evaluateRuntime(); + +export interface Runtime { + type: "browser" | "web-worker" | "deno" | "bun" | "node" | "react-native" | "unknown" | "workerd" | "edge-runtime"; + version?: string; + parsedVersion?: number; +} + +function evaluateRuntime(): Runtime { + /** + * A constant that indicates whether the environment the code is running is a Web Browser. + */ + const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + if (isBrowser) { + return { + type: "browser", + version: window.navigator.userAgent, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Cloudflare. + * https://developers.cloudflare.com/workers/runtime-apis/web-standards/#navigatoruseragent + */ + const isCloudflare = typeof globalThis !== "undefined" && globalThis?.navigator?.userAgent === "Cloudflare-Workers"; + if (isCloudflare) { + return { + type: "workerd", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Edge Runtime. + * https://vercel.com/docs/functions/runtimes/edge-runtime#check-if-you're-running-on-the-edge-runtime + */ + const isEdgeRuntime = typeof EdgeRuntime === "string"; + if (isEdgeRuntime) { + return { + type: "edge-runtime", + }; + } + + /** + * A constant that indicates whether the environment the code is running is a Web Worker. + */ + const isWebWorker = + typeof self === "object" && + typeof self?.importScripts === "function" && + (self.constructor?.name === "DedicatedWorkerGlobalScope" || + self.constructor?.name === "ServiceWorkerGlobalScope" || + self.constructor?.name === "SharedWorkerGlobalScope"); + if (isWebWorker) { + return { + type: "web-worker", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Deno. + * FYI Deno spoofs process.versions.node, see https://deno.land/std@0.177.0/node/process.ts?s=versions + */ + const isDeno = + typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + if (isDeno) { + return { + type: "deno", + version: Deno.version.deno, + }; + } + + /** + * A constant that indicates whether the environment the code is running is Bun.sh. + */ + const isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + if (isBun) { + return { + type: "bun", + version: Bun.version, + }; + } + + /** + * A constant that indicates whether the environment the code is running is in React-Native. + * This check should come before Node.js detection since React Native may have a process polyfill. + * https://github.com/facebook/react-native/blob/main/packages/react-native/Libraries/Core/setUpNavigator.js + */ + const isReactNative = typeof navigator !== "undefined" && navigator?.product === "ReactNative"; + if (isReactNative) { + return { + type: "react-native", + }; + } + + /** + * A constant that indicates whether the environment the code is running is Node.JS. + */ + const isNode = + typeof process !== "undefined" && + "version" in process && + !!process.version && + "versions" in process && + !!process.versions?.node; + if (isNode) { + return { + type: "node", + version: process.versions.node, + parsedVersion: Number(process.versions.node.split(".")[0]), + }; + } + + return { + type: "unknown", + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts new file mode 100644 index 000000000000..4cd8b1d95934 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/Schema.ts @@ -0,0 +1,103 @@ +import type { SchemaUtils } from "./builders/index.js"; + +export type Schema = BaseSchema & SchemaUtils; + +export type inferRaw = S extends Schema ? Raw : never; +export type inferParsed = S extends Schema ? Parsed : never; + +export interface BaseSchema { + parse: (raw: unknown, opts?: SchemaOptions) => MaybeValid; + json: (parsed: unknown, opts?: SchemaOptions) => MaybeValid; + getType: () => SchemaType | SchemaType; +} + +export const SchemaType = { + BIGINT: "bigint", + DATE: "date", + ENUM: "enum", + LIST: "list", + STRING_LITERAL: "stringLiteral", + BOOLEAN_LITERAL: "booleanLiteral", + OBJECT: "object", + ANY: "any", + BOOLEAN: "boolean", + NUMBER: "number", + STRING: "string", + UNKNOWN: "unknown", + NEVER: "never", + RECORD: "record", + SET: "set", + UNION: "union", + UNDISCRIMINATED_UNION: "undiscriminatedUnion", + NULLABLE: "nullable", + OPTIONAL: "optional", + OPTIONAL_NULLABLE: "optionalNullable", +} as const; + +export type SchemaType = (typeof SchemaType)[keyof typeof SchemaType]; + +export type MaybeValid = Valid | Invalid; + +export interface Valid { + ok: true; + value: T; +} + +export interface Invalid { + ok: false; + errors: ValidationError[]; +} + +export interface ValidationError { + path: string[]; + message: string; +} + +export interface SchemaOptions { + /** + * how to handle unrecognized keys in objects + * + * @default "fail" + */ + unrecognizedObjectKeys?: "fail" | "passthrough" | "strip"; + + /** + * whether to fail when an unrecognized discriminant value is + * encountered in a union + * + * @default false + */ + allowUnrecognizedUnionMembers?: boolean; + + /** + * whether to fail when an unrecognized enum value is encountered + * + * @default false + */ + allowUnrecognizedEnumValues?: boolean; + + /** + * whether to allow data that doesn't conform to the schema. + * invalid data is passed through without transformation. + * + * when this is enabled, .parse() and .json() will always + * return `ok: true`. `.parseOrThrow()` and `.jsonOrThrow()` + * will never fail. + * + * @default false + */ + skipValidation?: boolean; + + /** + * each validation failure contains a "path" property, which is + * the breadcrumbs to the offending node in the JSON. you can supply + * a prefix that is prepended to all the errors' paths. this can be + * helpful for zurg's internal debug logging. + */ + breadcrumbsPrefix?: string[]; + + /** + * whether to send 'null' for optional properties explicitly set to 'undefined'. + */ + omitUndefined?: boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts new file mode 100644 index 000000000000..2c7c74c54a37 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/bigint.ts @@ -0,0 +1,55 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function bigint(): Schema { + const baseSchema: BaseSchema = { + parse: (raw, { breadcrumbsPrefix = [] } = {}) => { + if (typeof raw === "bigint") { + return { + ok: true, + value: raw, + }; + } + if (typeof raw === "number") { + return { + ok: true, + value: BigInt(raw), + }; + } + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "bigint | number"), + }, + ], + }; + }, + json: (bigint, { breadcrumbsPrefix = [] } = {}) => { + if (typeof bigint !== "bigint") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(bigint, "bigint"), + }, + ], + }; + } + return { + ok: true, + value: bigint, + }; + }, + getType: () => SchemaType.BIGINT, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts new file mode 100644 index 000000000000..13cc76e25b2a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/bigint/index.ts @@ -0,0 +1 @@ +export { bigint } from "./bigint.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts new file mode 100644 index 000000000000..f02e3367f88f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/date.ts @@ -0,0 +1,65 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +// https://stackoverflow.com/questions/12756159/regex-and-iso8601-formatted-datetime +const ISO_8601_REGEX = + /^([+-]?\d{4}(?!\d{2}\b))((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])((:?)[0-5]\d)?|24:?00)([.,]\d+(?!:))?)?(\17[0-5]\d([.,]\d+)?)?([zZ]|([+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/; + +export function date(): Schema { + const baseSchema: BaseSchema = { + parse: (raw, { breadcrumbsPrefix = [] } = {}) => { + if (typeof raw !== "string") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "string"), + }, + ], + }; + } + if (!ISO_8601_REGEX.test(raw)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(raw, "ISO 8601 date string"), + }, + ], + }; + } + return { + ok: true, + value: new Date(raw), + }; + }, + json: (date, { breadcrumbsPrefix = [] } = {}) => { + if (date instanceof Date) { + return { + ok: true, + value: date.toISOString(), + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(date, "Date object"), + }, + ], + }; + } + }, + getType: () => SchemaType.DATE, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts new file mode 100644 index 000000000000..e22a2f16bfc9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/date/index.ts @@ -0,0 +1 @@ +export { date } from "./date.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts new file mode 100644 index 000000000000..ccae24bcf200 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/enum.ts @@ -0,0 +1,43 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function enum_(values: E): Schema { + const validValues = new Set(values); + + const schemaCreator = createIdentitySchemaCreator( + SchemaType.ENUM, + (value, { allowUnrecognizedEnumValues, breadcrumbsPrefix = [] } = {}) => { + if (typeof value !== "string") { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "string"), + }, + ], + }; + } + + if (!validValues.has(value) && !allowUnrecognizedEnumValues) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "enum"), + }, + ], + }; + } + + return { + ok: true, + value: value as U, + }; + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts new file mode 100644 index 000000000000..ff3bee3bf653 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/enum/index.ts @@ -0,0 +1 @@ +export { enum_ } from "./enum.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts new file mode 100644 index 000000000000..ddb9b3c94555 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/index.ts @@ -0,0 +1,14 @@ +export * from "./bigint/index.js"; +export * from "./date/index.js"; +export * from "./enum/index.js"; +export * from "./lazy/index.js"; +export * from "./list/index.js"; +export * from "./literals/index.js"; +export * from "./object/index.js"; +export * from "./object-like/index.js"; +export * from "./primitives/index.js"; +export * from "./record/index.js"; +export * from "./schema-utils/index.js"; +export * from "./set/index.js"; +export * from "./undiscriminated-union/index.js"; +export * from "./union/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts new file mode 100644 index 000000000000..e8ca40992061 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/index.ts @@ -0,0 +1,3 @@ +export type { SchemaGetter } from "./lazy.js"; +export { lazy } from "./lazy.js"; +export { lazyObject } from "./lazyObject.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts new file mode 100644 index 000000000000..37f28871683a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazy.ts @@ -0,0 +1,32 @@ +import type { BaseSchema, Schema } from "../../Schema.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export type SchemaGetter> = () => SchemaType; + +export function lazy(getter: SchemaGetter>): Schema { + const baseSchema = constructLazyBaseSchema(getter); + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function constructLazyBaseSchema( + getter: SchemaGetter>, +): BaseSchema { + return { + parse: (raw, opts) => getMemoizedSchema(getter).parse(raw, opts), + json: (parsed, opts) => getMemoizedSchema(getter).json(parsed, opts), + getType: () => getMemoizedSchema(getter).getType(), + }; +} + +type MemoizedGetter> = SchemaGetter & { __zurg_memoized?: SchemaType }; + +export function getMemoizedSchema>(getter: SchemaGetter): SchemaType { + const castedGetter = getter as MemoizedGetter; + if (castedGetter.__zurg_memoized == null) { + castedGetter.__zurg_memoized = getter(); + } + return castedGetter.__zurg_memoized; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts new file mode 100644 index 000000000000..192c90e5c83e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/lazy/lazyObject.ts @@ -0,0 +1,20 @@ +import { getObjectUtils } from "../object/index.js"; +import type { BaseObjectSchema, ObjectSchema } from "../object/types.js"; +import { getObjectLikeUtils } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import { constructLazyBaseSchema, getMemoizedSchema, type SchemaGetter } from "./lazy.js"; + +export function lazyObject(getter: SchemaGetter>): ObjectSchema { + const baseSchema: BaseObjectSchema = { + ...constructLazyBaseSchema(getter), + _getRawProperties: () => getMemoizedSchema(getter)._getRawProperties(), + _getParsedProperties: () => getMemoizedSchema(getter)._getParsedProperties(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts new file mode 100644 index 000000000000..021f1e4df1ff --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/index.ts @@ -0,0 +1 @@ +export { list } from "./list.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts new file mode 100644 index 000000000000..4f8c10ba483a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/list/list.ts @@ -0,0 +1,73 @@ +import { type BaseSchema, type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function list(schema: Schema): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => + validateAndTransformArray(raw, (item, index) => + schema.parse(item, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], + }), + ), + json: (parsed, opts) => + validateAndTransformArray(parsed, (item, index) => + schema.json(item, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `[${index}]`], + }), + ), + getType: () => SchemaType.LIST, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformArray( + value: unknown, + transformItem: (item: Raw, index: number) => MaybeValid, +): MaybeValid { + if (!Array.isArray(value)) { + return { + ok: false, + errors: [ + { + message: getErrorMessageForIncorrectType(value, "list"), + path: [], + }, + ], + }; + } + + const maybeValidItems = value.map((item, index) => transformItem(item, index)); + + return maybeValidItems.reduce>( + (acc, item) => { + if (acc.ok && item.ok) { + return { + ok: true, + value: [...acc.value, item.value], + }; + } + + const errors: ValidationError[] = []; + if (!acc.ok) { + errors.push(...acc.errors); + } + if (!item.ok) { + errors.push(...item.errors); + } + + return { + ok: false, + errors, + }; + }, + { ok: true, value: [] }, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts new file mode 100644 index 000000000000..db5d2c7a7313 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/booleanLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function booleanLiteral(literal: V): Schema { + const schemaCreator = createIdentitySchemaCreator( + SchemaType.BOOLEAN_LITERAL, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (value === literal) { + return { + ok: true, + value: literal, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, `${literal.toString()}`), + }, + ], + }; + } + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts new file mode 100644 index 000000000000..4a4ab39d91a7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/index.ts @@ -0,0 +1,2 @@ +export { booleanLiteral } from "./booleanLiteral.js"; +export { stringLiteral } from "./stringLiteral.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts new file mode 100644 index 000000000000..ce6e20caf8d6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/literals/stringLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export function stringLiteral(literal: V): Schema { + const schemaCreator = createIdentitySchemaCreator( + SchemaType.STRING_LITERAL, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (value === literal) { + return { + ok: true, + value: literal, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, `"${literal}"`), + }, + ], + }; + } + }, + ); + + return schemaCreator(); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts new file mode 100644 index 000000000000..af69acb01dc1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/getObjectLikeUtils.ts @@ -0,0 +1,79 @@ +import type { BaseSchema } from "../../Schema.js"; +import { filterObject } from "../../utils/filterObject.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; + +export function getObjectLikeUtils(schema: BaseSchema): ObjectLikeUtils { + return { + withParsedProperties: (properties) => withParsedProperties(schema, properties), + }; +} + +/** + * object-like utils are defined in one file to resolve issues with circular imports + */ + +export function withParsedProperties( + objectLike: BaseSchema, + properties: { [K in keyof Properties]: Properties[K] | ((parsed: ParsedObjectShape) => Properties[K]) }, +): ObjectLikeSchema { + const objectSchema: BaseSchema = { + parse: (raw, opts) => { + const parsedObject = objectLike.parse(raw, opts); + if (!parsedObject.ok) { + return parsedObject; + } + + const additionalProperties = Object.entries(properties).reduce>( + (processed, [key, value]) => { + return { + ...processed, + [key]: typeof value === "function" ? value(parsedObject.value) : value, + }; + }, + {}, + ); + + return { + ok: true, + value: { + ...parsedObject.value, + ...(additionalProperties as Properties), + }, + }; + }, + + json: (parsed, opts) => { + if (!isPlainObject(parsed)) { + return { + ok: false, + errors: [ + { + path: opts?.breadcrumbsPrefix ?? [], + message: getErrorMessageForIncorrectType(parsed, "object"), + }, + ], + }; + } + + // strip out added properties + const addedPropertyKeys = new Set(Object.keys(properties)); + const parsedWithoutAddedProperties = filterObject( + parsed, + Object.keys(parsed).filter((key) => !addedPropertyKeys.has(key)), + ); + + return objectLike.json(parsedWithoutAddedProperties as ParsedObjectShape, opts); + }, + + getType: () => objectLike.getType(), + }; + + return { + ...objectSchema, + ...getSchemaUtils(objectSchema), + ...getObjectLikeUtils(objectSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts new file mode 100644 index 000000000000..2451ef7d0e50 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/index.ts @@ -0,0 +1,2 @@ +export { getObjectLikeUtils, withParsedProperties } from "./getObjectLikeUtils.js"; +export type { ObjectLikeSchema, ObjectLikeUtils } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts new file mode 100644 index 000000000000..44b9669108cb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object-like/types.ts @@ -0,0 +1,13 @@ +import type { BaseSchema, Schema } from "../../Schema.js"; + +export type ObjectLikeSchema = Schema & + BaseSchema & + ObjectLikeUtils; + +export interface ObjectLikeUtils { + withParsedProperties: >( + properties: { + [K in keyof T]: T[K] | ((parsed: Parsed) => T[K]); + }, + ) => ObjectLikeSchema; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts new file mode 100644 index 000000000000..c6611aaacd3b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/index.ts @@ -0,0 +1,22 @@ +export { getObjectUtils, object } from "./object.js"; +export type { + inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas, +} from "./objectWithoutOptionalProperties.js"; +export { objectWithoutOptionalProperties } from "./objectWithoutOptionalProperties.js"; +export type { Property } from "./property.js"; +export { isProperty, property } from "./property.js"; +export type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObject, + inferParsedObjectFromPropertySchemas, + inferParsedPropertySchema, + inferRawKey, + inferRawObject, + inferRawObjectFromPropertySchemas, + inferRawPropertySchema, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts new file mode 100644 index 000000000000..624d4d3888d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/object.ts @@ -0,0 +1,382 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { entries } from "../../utils/entries.js"; +import { filterObject } from "../../utils/filterObject.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { keys } from "../../utils/keys.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { partition } from "../../utils/partition.js"; +import { getObjectLikeUtils } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import { isProperty } from "./property.js"; +import type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObjectFromPropertySchemas, + inferRawObjectFromPropertySchemas, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types.js"; + +interface ObjectPropertyWithRawKey { + rawKey: string; + parsedKey: string; + valueSchema: Schema; +} + +export function object>( + schemas: T, +): inferObjectSchemaFromPropertySchemas { + const baseSchema: BaseObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectFromPropertySchemas + > = { + _getRawProperties: () => + Object.entries(schemas).map(([parsedKey, propertySchema]) => + isProperty(propertySchema) ? propertySchema.rawKey : parsedKey, + ) as unknown as (keyof inferRawObjectFromPropertySchemas)[], + _getParsedProperties: () => keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[], + + parse: (raw, opts) => { + const rawKeyToProperty: Record = {}; + const requiredKeys: string[] = []; + + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const rawKey = isProperty(schemaOrObjectProperty) ? schemaOrObjectProperty.rawKey : parsedKey; + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; + + const property: ObjectPropertyWithRawKey = { + rawKey, + parsedKey: parsedKey as string, + valueSchema, + }; + + rawKeyToProperty[rawKey] = property; + + if (isSchemaRequired(valueSchema)) { + requiredKeys.push(rawKey); + } + } + + return validateAndTransformObject({ + value: raw, + requiredKeys, + getProperty: (rawKey) => { + const property = rawKeyToProperty[rawKey]; + if (property == null) { + return undefined; + } + return { + transformedKey: property.parsedKey, + transform: (propertyValue) => + property.valueSchema.parse(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawKey], + }), + }; + }, + unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, + skipValidation: opts?.skipValidation, + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + omitUndefined: opts?.omitUndefined, + }); + }, + + json: (parsed, opts) => { + const requiredKeys: string[] = []; + + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; + + if (isSchemaRequired(valueSchema)) { + requiredKeys.push(parsedKey as string); + } + } + + return validateAndTransformObject({ + value: parsed, + requiredKeys, + getProperty: ( + parsedKey, + ): { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined => { + const property = schemas[parsedKey as keyof T]; + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (property == null) { + return undefined; + } + + if (isProperty(property)) { + return { + transformedKey: property.rawKey, + transform: (propertyValue) => + property.valueSchema.json(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], + }), + }; + } else { + return { + transformedKey: parsedKey, + transform: (propertyValue) => + property.json(propertyValue, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedKey], + }), + }; + } + }, + unrecognizedObjectKeys: opts?.unrecognizedObjectKeys, + skipValidation: opts?.skipValidation, + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + omitUndefined: opts?.omitUndefined, + }); + }, + + getType: () => SchemaType.OBJECT, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} + +function validateAndTransformObject({ + value, + requiredKeys, + getProperty, + unrecognizedObjectKeys = "fail", + skipValidation = false, + breadcrumbsPrefix = [], +}: { + value: unknown; + requiredKeys: string[]; + getProperty: ( + preTransformedKey: string, + ) => { transformedKey: string; transform: (propertyValue: object) => MaybeValid } | undefined; + unrecognizedObjectKeys: "fail" | "passthrough" | "strip" | undefined; + skipValidation: boolean | undefined; + breadcrumbsPrefix: string[] | undefined; + omitUndefined: boolean | undefined; +}): MaybeValid { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const missingRequiredKeys = new Set(requiredKeys); + const errors: ValidationError[] = []; + const transformed: Record = {}; + + for (const [preTransformedKey, preTransformedItemValue] of Object.entries(value)) { + const property = getProperty(preTransformedKey); + + if (property != null) { + missingRequiredKeys.delete(preTransformedKey); + + const value = property.transform(preTransformedItemValue as object); + if (value.ok) { + transformed[property.transformedKey] = value.value; + } else { + transformed[preTransformedKey] = preTransformedItemValue; + errors.push(...value.errors); + } + } else { + switch (unrecognizedObjectKeys) { + case "fail": + errors.push({ + path: [...breadcrumbsPrefix, preTransformedKey], + message: `Unexpected key "${preTransformedKey}"`, + }); + break; + case "strip": + break; + case "passthrough": + transformed[preTransformedKey] = preTransformedItemValue; + break; + } + } + } + + errors.push( + ...requiredKeys + .filter((key) => missingRequiredKeys.has(key)) + .map((key) => ({ + path: breadcrumbsPrefix, + message: `Missing required key "${key}"`, + })), + ); + + if (errors.length === 0 || skipValidation) { + return { + ok: true, + value: transformed as Transformed, + }; + } else { + return { + ok: false, + errors, + }; + } +} + +export function getObjectUtils(schema: BaseObjectSchema): ObjectUtils { + return { + extend: (extension: ObjectSchema) => { + const baseSchema: BaseObjectSchema = { + _getParsedProperties: () => [...schema._getParsedProperties(), ...extension._getParsedProperties()], + _getRawProperties: () => [...schema._getRawProperties(), ...extension._getRawProperties()], + parse: (raw, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: extension._getRawProperties(), + value: raw, + transformBase: (rawBase) => schema.parse(rawBase, opts), + transformExtension: (rawExtension) => extension.parse(rawExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: extension._getParsedProperties(), + value: parsed, + transformBase: (parsedBase) => schema.json(parsedBase, opts), + transformExtension: (parsedExtension) => extension.json(parsedExtension, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.OBJECT, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; + }, + passthrough: () => { + const baseSchema: BaseObjectSchema = + { + _getParsedProperties: () => schema._getParsedProperties(), + _getRawProperties: () => schema._getRawProperties(), + parse: (raw, opts) => { + const transformed = schema.parse(raw, { ...opts, unrecognizedObjectKeys: "passthrough" }); + if (!transformed.ok) { + return transformed; + } + return { + ok: true, + value: { + ...(raw as any), + ...transformed.value, + }, + }; + }, + json: (parsed, opts) => { + const transformed = schema.json(parsed, { ...opts, unrecognizedObjectKeys: "passthrough" }); + if (!transformed.ok) { + return transformed; + } + return { + ok: true, + value: { + ...(parsed as any), + ...transformed.value, + }, + }; + }, + getType: () => SchemaType.OBJECT, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; + }, + }; +} + +function validateAndTransformExtendedObject({ + extensionKeys, + value, + transformBase, + transformExtension, + breadcrumbsPrefix = [], +}: { + extensionKeys: (keyof PreTransformedExtension)[]; + value: unknown; + transformBase: (value: object) => MaybeValid; + transformExtension: (value: object) => MaybeValid; + breadcrumbsPrefix?: string[]; +}): MaybeValid { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const extensionPropertiesSet = new Set(extensionKeys); + const [extensionProperties, baseProperties] = partition(keys(value), (key) => + extensionPropertiesSet.has(key as keyof PreTransformedExtension), + ); + + const transformedBase = transformBase(filterObject(value, baseProperties)); + const transformedExtension = transformExtension(filterObject(value, extensionProperties)); + + if (transformedBase.ok && transformedExtension.ok) { + return { + ok: true, + value: { + ...transformedBase.value, + ...transformedExtension.value, + }, + }; + } else { + return { + ok: false, + errors: [ + ...(transformedBase.ok ? [] : transformedBase.errors), + ...(transformedExtension.ok ? [] : transformedExtension.errors), + ], + }; + } +} + +function isSchemaRequired(schema: Schema): boolean { + return !isSchemaOptional(schema); +} + +function isSchemaOptional(schema: Schema): boolean { + switch (schema.getType()) { + case SchemaType.ANY: + case SchemaType.UNKNOWN: + case SchemaType.OPTIONAL: + case SchemaType.OPTIONAL_NULLABLE: + return true; + default: + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts new file mode 100644 index 000000000000..4d39c862f0c4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/objectWithoutOptionalProperties.ts @@ -0,0 +1,23 @@ +import { object } from "./object.js"; +import type { + inferParsedPropertySchema, + inferRawObjectFromPropertySchemas, + ObjectSchema, + PropertySchemas, +} from "./types.js"; + +export function objectWithoutOptionalProperties>( + schemas: T, +): inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas { + return object(schemas) as unknown as inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas; +} + +export type inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas> = + ObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas + >; + +export type inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas> = { + [K in keyof T]: inferParsedPropertySchema; +}; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts new file mode 100644 index 000000000000..d1f9f386aa64 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/property.ts @@ -0,0 +1,23 @@ +import type { Schema } from "../../Schema.js"; + +export function property( + rawKey: RawKey, + valueSchema: Schema, +): Property { + return { + rawKey, + valueSchema, + isProperty: true, + }; +} + +export interface Property { + rawKey: RawKey; + valueSchema: Schema; + isProperty: true; +} + +export function isProperty>(maybeProperty: unknown): maybeProperty is O { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return (maybeProperty as O).isProperty; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts new file mode 100644 index 000000000000..735d14fc4cee --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/object/types.ts @@ -0,0 +1,73 @@ +import type { BaseSchema, inferParsed, inferRaw, Schema } from "../../Schema.js"; +import type { addQuestionMarksToNullableProperties } from "../../utils/addQuestionMarksToNullableProperties.js"; +import type { ObjectLikeUtils } from "../object-like/index.js"; +import type { SchemaUtils } from "../schema-utils/index.js"; +import type { Property } from "./property.js"; + +export type ObjectSchema = BaseObjectSchema & + ObjectLikeUtils & + ObjectUtils & + SchemaUtils; + +export interface BaseObjectSchema extends BaseSchema { + _getRawProperties: () => (keyof Raw)[]; + _getParsedProperties: () => (keyof Parsed)[]; +} + +export interface ObjectUtils { + extend: ( + schemas: ObjectSchema, + ) => ObjectSchema; + passthrough: () => ObjectSchema; +} + +export type inferRawObject> = O extends ObjectSchema ? Raw : never; + +export type inferParsedObject> = O extends ObjectSchema + ? Parsed + : never; + +export type inferObjectSchemaFromPropertySchemas> = ObjectSchema< + inferRawObjectFromPropertySchemas, + inferParsedObjectFromPropertySchemas +>; + +export type inferRawObjectFromPropertySchemas> = + addQuestionMarksToNullableProperties<{ + [ParsedKey in keyof T as inferRawKey]: inferRawPropertySchema; + }>; + +export type inferParsedObjectFromPropertySchemas> = + addQuestionMarksToNullableProperties<{ + [K in keyof T]: inferParsedPropertySchema; + }>; + +export type PropertySchemas = Record< + ParsedKeys, + Property | Schema +>; + +export type inferRawPropertySchema

| Schema> = P extends Property< + any, + infer Raw, + any +> + ? Raw + : P extends Schema + ? inferRaw

+ : never; + +export type inferParsedPropertySchema

| Schema> = P extends Property< + any, + any, + infer Parsed +> + ? Parsed + : P extends Schema + ? inferParsed

+ : never; + +export type inferRawKey< + ParsedKey extends string | number | symbol, + P extends Property | Schema, +> = P extends Property ? Raw : ParsedKey; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts new file mode 100644 index 000000000000..bc4d47fab56e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/any.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const any: () => Schema = createIdentitySchemaCreator(SchemaType.ANY, (value) => ({ + ok: true, + value, +})); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts new file mode 100644 index 000000000000..78c3c36284c7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/boolean.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const boolean: () => Schema = createIdentitySchemaCreator( + SchemaType.BOOLEAN, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "boolean") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "boolean"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts new file mode 100644 index 000000000000..7a3ee0154829 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/index.ts @@ -0,0 +1,6 @@ +export { any } from "./any.js"; +export { boolean } from "./boolean.js"; +export { never } from "./never.js"; +export { number } from "./number.js"; +export { string } from "./string.js"; +export { unknown } from "./unknown.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts new file mode 100644 index 000000000000..91f85d74c01b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/never.ts @@ -0,0 +1,15 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const never: () => Schema = createIdentitySchemaCreator( + SchemaType.NEVER, + (_value, { breadcrumbsPrefix = [] } = {}) => ({ + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: "Expected never", + }, + ], + }), +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts new file mode 100644 index 000000000000..6f16cd462a1b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/number.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const number: () => Schema = createIdentitySchemaCreator( + SchemaType.NUMBER, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "number") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "number"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts new file mode 100644 index 000000000000..b29d72ae7ef1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/string.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; + +export const string: () => Schema = createIdentitySchemaCreator( + SchemaType.STRING, + (value, { breadcrumbsPrefix = [] } = {}) => { + if (typeof value === "string") { + return { + ok: true, + value, + }; + } else { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "string"), + }, + ], + }; + } + }, +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts new file mode 100644 index 000000000000..04514160366f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/primitives/unknown.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema.js"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; + +export const unknown: () => Schema = createIdentitySchemaCreator( + SchemaType.UNKNOWN, + (value) => ({ ok: true, value }), +); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts new file mode 100644 index 000000000000..b17997f7bf84 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/index.ts @@ -0,0 +1,2 @@ +export { record } from "./record.js"; +export type { BaseRecordSchema, RecordSchema } from "./types.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts new file mode 100644 index 000000000000..a489660399b7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/record.ts @@ -0,0 +1,129 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema.js"; +import { entries } from "../../utils/entries.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { BaseRecordSchema, RecordSchema } from "./types.js"; + +export function record( + keySchema: Schema, + valueSchema: Schema, +): RecordSchema { + const baseSchema: BaseRecordSchema = { + parse: (raw, opts) => { + return validateAndTransformRecord({ + value: raw, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.parse(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.parse(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return validateAndTransformRecord({ + value: parsed, + isKeyNumeric: keySchema.getType() === SchemaType.NUMBER, + transformKey: (key) => + keySchema.json(key, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key} (key)`], + }), + transformValue: (value, key) => + valueSchema.json(value, { + ...opts, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), `${key}`], + }), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.RECORD, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformRecord({ + value, + isKeyNumeric, + transformKey, + transformValue, + breadcrumbsPrefix = [], +}: { + value: unknown; + isKeyNumeric: boolean; + transformKey: (key: string | number) => MaybeValid; + transformValue: (value: unknown, key: string | number) => MaybeValid; + breadcrumbsPrefix: string[] | undefined; +}): MaybeValid> { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + return entries(value).reduce>>( + (accPromise, [stringKey, value]) => { + if (value === undefined) { + return accPromise; + } + + const acc = accPromise; + + let key: string | number = stringKey; + if (isKeyNumeric) { + const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; + if (!Number.isNaN(numberKey)) { + key = numberKey; + } + } + const transformedKey = transformKey(key); + + const transformedValue = transformValue(value, key); + + if (acc.ok && transformedKey.ok && transformedValue.ok) { + return { + ok: true, + value: { + ...acc.value, + [transformedKey.value]: transformedValue.value, + }, + }; + } + + const errors: ValidationError[] = []; + if (!acc.ok) { + errors.push(...acc.errors); + } + if (!transformedKey.ok) { + errors.push(...transformedKey.errors); + } + if (!transformedValue.ok) { + errors.push(...transformedValue.errors); + } + + return { + ok: false, + errors, + }; + }, + { ok: true, value: {} as Record }, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts new file mode 100644 index 000000000000..5950b4cbde1e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/record/types.ts @@ -0,0 +1,17 @@ +import type { BaseSchema } from "../../Schema.js"; +import type { SchemaUtils } from "../schema-utils/index.js"; + +export type RecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BaseRecordSchema & + SchemaUtils, Record>; + +export type BaseRecordSchema< + RawKey extends string | number, + RawValue, + ParsedKey extends string | number, + ParsedValue, +> = BaseSchema, Record>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts new file mode 100644 index 000000000000..daee3dc79184 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/JsonError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema.js"; +import { stringifyValidationError } from "./stringifyValidationErrors.js"; + +export class JsonError extends Error { + constructor(public readonly errors: ValidationError[]) { + super(errors.map(stringifyValidationError).join("; ")); + Object.setPrototypeOf(this, JsonError.prototype); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts new file mode 100644 index 000000000000..9facf06159b2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/ParseError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema.js"; +import { stringifyValidationError } from "./stringifyValidationErrors.js"; + +export class ParseError extends Error { + constructor(public readonly errors: ValidationError[]) { + super(errors.map(stringifyValidationError).join("; ")); + Object.setPrototypeOf(this, ParseError.prototype); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts new file mode 100644 index 000000000000..3ceaf4e011f0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/getSchemaUtils.ts @@ -0,0 +1,181 @@ +import { type BaseSchema, type Schema, type SchemaOptions, SchemaType } from "../../Schema.js"; +import { JsonError } from "./JsonError.js"; +import { ParseError } from "./ParseError.js"; + +export interface SchemaUtils { + nullable: () => Schema; + optional: () => Schema; + optionalNullable: () => Schema; + transform: (transformer: SchemaTransformer) => Schema; + parseOrThrow: (raw: unknown, opts?: SchemaOptions) => Parsed; + jsonOrThrow: (raw: unknown, opts?: SchemaOptions) => Raw; +} + +export interface SchemaTransformer { + transform: (parsed: Parsed) => Transformed; + untransform: (transformed: any) => Parsed; +} + +export function getSchemaUtils(schema: BaseSchema): SchemaUtils { + return { + nullable: () => nullable(schema), + optional: () => optional(schema), + optionalNullable: () => optionalNullable(schema), + transform: (transformer) => transform(schema, transformer), + parseOrThrow: (raw, opts) => { + const parsed = schema.parse(raw, opts); + if (parsed.ok) { + return parsed.value; + } + throw new ParseError(parsed.errors); + }, + jsonOrThrow: (parsed, opts) => { + const raw = schema.json(parsed, opts); + if (raw.ok) { + return raw.value; + } + throw new JsonError(raw.errors); + }, + }; +} + +/** + * schema utils are defined in one file to resolve issues with circular imports + */ + +export function nullable(schema: BaseSchema): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw == null) { + return { + ok: true, + value: null, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (parsed == null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.NULLABLE, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function optional( + schema: BaseSchema, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw == null) { + return { + ok: true, + value: undefined, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (opts?.omitUndefined && parsed === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (parsed == null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.OPTIONAL, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function optionalNullable( + schema: BaseSchema, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + if (raw === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (raw === null) { + return { + ok: true, + value: null, + }; + } + return schema.parse(raw, opts); + }, + json: (parsed, opts) => { + if (parsed === undefined) { + return { + ok: true, + value: undefined, + }; + } + if (parsed === null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.OPTIONAL_NULLABLE, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function transform( + schema: BaseSchema, + transformer: SchemaTransformer, +): Schema { + const baseSchema: BaseSchema = { + parse: (raw, opts) => { + const parsed = schema.parse(raw, opts); + if (!parsed.ok) { + return parsed; + } + return { + ok: true, + value: transformer.transform(parsed.value), + }; + }, + json: (transformed, opts) => { + const parsed = transformer.untransform(transformed); + return schema.json(parsed, opts); + }, + getType: () => schema.getType(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts new file mode 100644 index 000000000000..efb3b0c46288 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/index.ts @@ -0,0 +1,4 @@ +export type { SchemaUtils } from "./getSchemaUtils.js"; +export { getSchemaUtils, optional, transform } from "./getSchemaUtils.js"; +export { JsonError } from "./JsonError.js"; +export { ParseError } from "./ParseError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts new file mode 100644 index 000000000000..d36a4900c6e6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts @@ -0,0 +1,8 @@ +import type { ValidationError } from "../../Schema.js"; + +export function stringifyValidationError(error: ValidationError): string { + if (error.path.length === 0) { + return error.message; + } + return `${error.path.join(" -> ")}: ${error.message}`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts new file mode 100644 index 000000000000..c72be55e9406 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/index.ts @@ -0,0 +1 @@ +export { set } from "./set.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts new file mode 100644 index 000000000000..2013cdb4760f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/set/set.ts @@ -0,0 +1,43 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { list } from "../list/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; + +export function set(schema: Schema): Schema> { + const listSchema = list(schema); + const baseSchema: BaseSchema> = { + parse: (raw, opts) => { + const parsedList = listSchema.parse(raw, opts); + if (parsedList.ok) { + return { + ok: true, + value: new Set(parsedList.value), + }; + } else { + return parsedList; + } + }, + json: (parsed, opts) => { + if (!(parsed instanceof Set)) { + return { + ok: false, + errors: [ + { + path: opts?.breadcrumbsPrefix ?? [], + message: getErrorMessageForIncorrectType(parsed, "Set"), + }, + ], + }; + } + const jsonList = listSchema.json([...parsed], opts); + return jsonList; + }, + getType: () => SchemaType.SET, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts new file mode 100644 index 000000000000..c8318222b4f7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/index.ts @@ -0,0 +1,6 @@ +export type { + inferParsedUnidiscriminatedUnionSchema, + inferRawUnidiscriminatedUnionSchema, + UndiscriminatedUnionSchema, +} from "./types.js"; +export { undiscriminatedUnion } from "./undiscriminatedUnion.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts new file mode 100644 index 000000000000..0d5096fab913 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/types.ts @@ -0,0 +1,10 @@ +import type { inferParsed, inferRaw, Schema } from "../../Schema.js"; + +export type UndiscriminatedUnionSchema = Schema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema +>; + +export type inferRawUnidiscriminatedUnionSchema = inferRaw; + +export type inferParsedUnidiscriminatedUnionSchema = inferParsed; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts new file mode 100644 index 000000000000..07591b4d3e63 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts @@ -0,0 +1,67 @@ +import { + type BaseSchema, + type MaybeValid, + type Schema, + type SchemaOptions, + SchemaType, + type ValidationError, +} from "../../Schema.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { inferParsedUnidiscriminatedUnionSchema, inferRawUnidiscriminatedUnionSchema } from "./types.js"; + +export function undiscriminatedUnion, ...Schema[]]>( + schemas: Schemas, +): Schema, inferParsedUnidiscriminatedUnionSchema> { + const baseSchema: BaseSchema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema + > = { + parse: (raw, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.parse(raw, opts), + schemas, + opts, + ); + }, + json: (parsed, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.json(parsed, opts), + schemas, + opts, + ); + }, + getType: () => SchemaType.UNDISCRIMINATED_UNION, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +function validateAndTransformUndiscriminatedUnion( + transform: (schema: Schema, opts: SchemaOptions) => MaybeValid, + schemas: Schema[], + opts: SchemaOptions | undefined, +): MaybeValid { + const errors: ValidationError[] = []; + for (const [index, schema] of schemas.entries()) { + const transformed = transform(schema, { ...opts, skipValidation: false }); + if (transformed.ok) { + return transformed; + } else { + for (const error of transformed.errors) { + errors.push({ + path: error.path, + message: `[Variant ${index}] ${error.message}`, + }); + } + } + } + + return { + ok: false, + errors, + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts new file mode 100644 index 000000000000..73cd62adeba5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/discriminant.ts @@ -0,0 +1,14 @@ +export function discriminant( + parsedDiscriminant: ParsedDiscriminant, + rawDiscriminant: RawDiscriminant, +): Discriminant { + return { + parsedDiscriminant, + rawDiscriminant, + }; +} + +export interface Discriminant { + parsedDiscriminant: ParsedDiscriminant; + rawDiscriminant: RawDiscriminant; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts new file mode 100644 index 000000000000..6bc29ba9ed38 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/index.ts @@ -0,0 +1,10 @@ +export type { Discriminant } from "./discriminant.js"; +export { discriminant } from "./discriminant.js"; +export type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types.js"; +export { union } from "./union.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts new file mode 100644 index 000000000000..7bfdd636d8d0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/types.ts @@ -0,0 +1,26 @@ +import type { inferParsedObject, inferRawObject, ObjectSchema } from "../object/index.js"; +import type { Discriminant } from "./discriminant.js"; + +export type UnionSubtypes = { + [K in DiscriminantValues]: ObjectSchema; +}; + +export type inferRawUnion, U extends UnionSubtypes> = { + [K in keyof U]: Record, K> & inferRawObject; +}[keyof U]; + +export type inferParsedUnion, U extends UnionSubtypes> = { + [K in keyof U]: Record, K> & inferParsedObject; +}[keyof U]; + +export type inferRawDiscriminant> = D extends string + ? D + : D extends Discriminant + ? Raw + : never; + +export type inferParsedDiscriminant> = D extends string + ? D + : D extends Discriminant + ? Parsed + : never; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts new file mode 100644 index 000000000000..509658e0eb3d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/builders/union/union.ts @@ -0,0 +1,176 @@ +import { type BaseSchema, type MaybeValid, SchemaType } from "../../Schema.js"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType.js"; +import { isPlainObject } from "../../utils/isPlainObject.js"; +import { keys } from "../../utils/keys.js"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation.js"; +import { enum_ } from "../enum/index.js"; +import type { ObjectSchema } from "../object/index.js"; +import { getObjectLikeUtils, type ObjectLikeSchema } from "../object-like/index.js"; +import { getSchemaUtils } from "../schema-utils/index.js"; +import type { Discriminant } from "./discriminant.js"; +import type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types.js"; + +export function union, U extends UnionSubtypes>( + discriminant: D, + union: U, +): ObjectLikeSchema, inferParsedUnion> { + const rawDiscriminant = + typeof discriminant === "string" ? discriminant : (discriminant.rawDiscriminant as inferRawDiscriminant); + const parsedDiscriminant = + typeof discriminant === "string" + ? discriminant + : (discriminant.parsedDiscriminant as inferParsedDiscriminant); + + const discriminantValueSchema = enum_(keys(union) as string[]); + + const baseSchema: BaseSchema, inferParsedUnion> = { + parse: (raw, opts) => { + return transformAndValidateUnion({ + value: raw, + discriminant: rawDiscriminant, + transformedDiscriminant: parsedDiscriminant, + transformDiscriminantValue: (discriminantValue) => + discriminantValueSchema.parse(discriminantValue, { + allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), rawDiscriminant], + }), + getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], + allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, + transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => + additionalPropertiesSchema.parse(additionalProperties, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + json: (parsed, opts) => { + return transformAndValidateUnion({ + value: parsed, + discriminant: parsedDiscriminant, + transformedDiscriminant: rawDiscriminant, + transformDiscriminantValue: (discriminantValue) => + discriminantValueSchema.json(discriminantValue, { + allowUnrecognizedEnumValues: opts?.allowUnrecognizedUnionMembers, + breadcrumbsPrefix: [...(opts?.breadcrumbsPrefix ?? []), parsedDiscriminant], + }), + getAdditionalPropertiesSchema: (discriminantValue) => union[discriminantValue], + allowUnrecognizedUnionMembers: opts?.allowUnrecognizedUnionMembers, + transformAdditionalProperties: (additionalProperties, additionalPropertiesSchema) => + additionalPropertiesSchema.json(additionalProperties, opts), + breadcrumbsPrefix: opts?.breadcrumbsPrefix, + }); + }, + getType: () => SchemaType.UNION, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + }; +} + +function transformAndValidateUnion< + TransformedDiscriminant extends string, + TransformedDiscriminantValue extends string, + TransformedAdditionalProperties, +>({ + value, + discriminant, + transformedDiscriminant, + transformDiscriminantValue, + getAdditionalPropertiesSchema, + allowUnrecognizedUnionMembers = false, + transformAdditionalProperties, + breadcrumbsPrefix = [], +}: { + value: unknown; + discriminant: string; + transformedDiscriminant: TransformedDiscriminant; + transformDiscriminantValue: (discriminantValue: unknown) => MaybeValid; + getAdditionalPropertiesSchema: (discriminantValue: string) => ObjectSchema | undefined; + allowUnrecognizedUnionMembers: boolean | undefined; + transformAdditionalProperties: ( + additionalProperties: unknown, + additionalPropertiesSchema: ObjectSchema, + ) => MaybeValid; + breadcrumbsPrefix: string[] | undefined; +}): MaybeValid & TransformedAdditionalProperties> { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + const { [discriminant]: discriminantValue, ...additionalProperties } = value; + + if (discriminantValue == null) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: `Missing discriminant ("${discriminant}")`, + }, + ], + }; + } + + const transformedDiscriminantValue = transformDiscriminantValue(discriminantValue); + if (!transformedDiscriminantValue.ok) { + return { + ok: false, + errors: transformedDiscriminantValue.errors, + }; + } + + const additionalPropertiesSchema = getAdditionalPropertiesSchema(transformedDiscriminantValue.value); + + if (additionalPropertiesSchema == null) { + if (allowUnrecognizedUnionMembers) { + return { + ok: true, + value: { + [transformedDiscriminant]: transformedDiscriminantValue.value, + ...additionalProperties, + } as Record & TransformedAdditionalProperties, + }; + } else { + return { + ok: false, + errors: [ + { + path: [...breadcrumbsPrefix, discriminant], + message: "Unexpected discriminant value", + }, + ], + }; + } + } + + const transformedAdditionalProperties = transformAdditionalProperties( + additionalProperties, + additionalPropertiesSchema, + ); + if (!transformedAdditionalProperties.ok) { + return transformedAdditionalProperties; + } + + return { + ok: true, + value: { + [transformedDiscriminant]: discriminantValue, + ...transformedAdditionalProperties.value, + } as Record & TransformedAdditionalProperties, + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts new file mode 100644 index 000000000000..befac2e3bebc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/index.ts @@ -0,0 +1,2 @@ +export * from "./builders/index.js"; +export type { inferParsed, inferRaw, Schema, SchemaOptions } from "./Schema.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts new file mode 100644 index 000000000000..9cd354b3418e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/MaybePromise.ts @@ -0,0 +1 @@ +export type MaybePromise = T | Promise; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts new file mode 100644 index 000000000000..59f9e658867b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts @@ -0,0 +1,9 @@ +export type addQuestionMarksToNullableProperties = { + [K in OptionalKeys]?: T[K]; +} & Pick>; + +export type OptionalKeys = { + [K in keyof T]-?: undefined extends T[K] ? K : never; +}[keyof T]; + +export type RequiredKeys = Exclude>; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts new file mode 100644 index 000000000000..9aa4ed5029a0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/createIdentitySchemaCreator.ts @@ -0,0 +1,21 @@ +import { getSchemaUtils } from "../builders/schema-utils/index.js"; +import type { BaseSchema, MaybeValid, Schema, SchemaOptions, SchemaType } from "../Schema.js"; +import { maybeSkipValidation } from "./maybeSkipValidation.js"; + +export function createIdentitySchemaCreator( + schemaType: SchemaType, + validate: (value: unknown, opts?: SchemaOptions) => MaybeValid, +): () => Schema { + return () => { + const baseSchema: BaseSchema = { + parse: validate, + json: validate, + getType: () => schemaType, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts new file mode 100644 index 000000000000..2d5c93d657ce --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/entries.ts @@ -0,0 +1,3 @@ +export function entries(object: T): [keyof T, T[keyof T]][] { + return Object.entries(object) as [keyof T, T[keyof T]][]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts new file mode 100644 index 000000000000..70527d10013b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/filterObject.ts @@ -0,0 +1,13 @@ +export function filterObject(obj: T, keysToInclude: K[]): Pick { + const keysToIncludeSet = new Set(keysToInclude); + return Object.entries(obj).reduce( + (acc, [key, value]) => { + if (keysToIncludeSet.has(key as K)) { + acc[key as K] = value as T[K]; + } + return acc; + // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter + }, + {} as Pick, + ); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts new file mode 100644 index 000000000000..1a5c31027ce9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/getErrorMessageForIncorrectType.ts @@ -0,0 +1,25 @@ +export function getErrorMessageForIncorrectType(value: unknown, expectedType: string): string { + return `Expected ${expectedType}. Received ${getTypeAsString(value)}.`; +} + +function getTypeAsString(value: unknown): string { + if (Array.isArray(value)) { + return "list"; + } + if (value === null) { + return "null"; + } + if (value instanceof BigInt) { + return "BigInt"; + } + switch (typeof value) { + case "string": + return `"${value}"`; + case "bigint": + case "number": + case "boolean": + case "undefined": + return `${value}`; + } + return typeof value; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts new file mode 100644 index 000000000000..db82a722c35b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/isPlainObject.ts @@ -0,0 +1,17 @@ +// borrowed from https://github.com/lodash/lodash/blob/master/isPlainObject.js +export function isPlainObject(value: unknown): value is Record { + if (typeof value !== "object" || value === null) { + return false; + } + + if (Object.getPrototypeOf(value) === null) { + return true; + } + + let proto = value; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + return Object.getPrototypeOf(value) === proto; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts new file mode 100644 index 000000000000..2e0930e2d70b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/keys.ts @@ -0,0 +1,3 @@ +export function keys(object: T): (keyof T)[] { + return Object.keys(object) as (keyof T)[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts new file mode 100644 index 000000000000..f32d4525136d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/maybeSkipValidation.ts @@ -0,0 +1,38 @@ +import type { BaseSchema, MaybeValid, SchemaOptions } from "../Schema.js"; + +export function maybeSkipValidation, Raw, Parsed>(schema: S): S { + return { + ...schema, + json: transformAndMaybeSkipValidation(schema.json), + parse: transformAndMaybeSkipValidation(schema.parse), + }; +} + +function transformAndMaybeSkipValidation( + transform: (value: unknown, opts?: SchemaOptions) => MaybeValid, +): (value: unknown, opts?: SchemaOptions) => MaybeValid { + return (value, opts): MaybeValid => { + const transformed = transform(value, opts); + const { skipValidation = false } = opts ?? {}; + if (!transformed.ok && skipValidation) { + // biome-ignore lint/suspicious/noConsole: allow console + console.warn( + [ + "Failed to validate.", + ...transformed.errors.map( + (error) => + " - " + + (error.path.length > 0 ? `${error.path.join(".")}: ${error.message}` : error.message), + ), + ].join("\n"), + ); + + return { + ok: true, + value: value as T, + }; + } else { + return transformed; + } + }; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts new file mode 100644 index 000000000000..f58d6f3d35f3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/schemas/utils/partition.ts @@ -0,0 +1,12 @@ +export function partition(items: readonly T[], predicate: (item: T) => boolean): [T[], T[]] { + const trueItems: T[] = [], + falseItems: T[] = []; + for (const item of items) { + if (predicate(item)) { + trueItems.push(item); + } else { + falseItems.push(item); + } + } + return [trueItems, falseItems]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts new file mode 100644 index 000000000000..19b901244218 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/encodePathParam.ts @@ -0,0 +1,18 @@ +export function encodePathParam(param: unknown): string { + if (param === null) { + return "null"; + } + const typeofParam = typeof param; + switch (typeofParam) { + case "undefined": + return "undefined"; + case "string": + case "number": + case "boolean": + break; + default: + param = String(param); + break; + } + return encodeURIComponent(param as string | number | boolean); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts new file mode 100644 index 000000000000..f2e0fa2d2221 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/index.ts @@ -0,0 +1,3 @@ +export { encodePathParam } from "./encodePathParam.js"; +export { join } from "./join.js"; +export { toQueryString } from "./qs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts new file mode 100644 index 000000000000..7ca7daef094d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/join.ts @@ -0,0 +1,79 @@ +export function join(base: string, ...segments: string[]): string { + if (!base) { + return ""; + } + + if (segments.length === 0) { + return base; + } + + if (base.includes("://")) { + let url: URL; + try { + url = new URL(base); + } catch { + return joinPath(base, ...segments); + } + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + url.pathname = joinPathSegments(url.pathname, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !url.pathname.endsWith("/")) { + url.pathname += "/"; + } + + return url.toString(); + } + + return joinPath(base, ...segments); +} + +function joinPath(base: string, ...segments: string[]): string { + if (segments.length === 0) { + return base; + } + + let result = base; + + const lastSegment = segments[segments.length - 1]; + const shouldPreserveTrailingSlash = lastSegment?.endsWith("/"); + + for (const segment of segments) { + const cleanSegment = trimSlashes(segment); + if (cleanSegment) { + result = joinPathSegments(result, cleanSegment); + } + } + + if (shouldPreserveTrailingSlash && !result.endsWith("/")) { + result += "/"; + } + + return result; +} + +function joinPathSegments(left: string, right: string): string { + if (left.endsWith("/")) { + return left + right; + } + return `${left}/${right}`; +} + +function trimSlashes(str: string): string { + if (!str) return str; + + let start = 0; + let end = str.length; + + if (str.startsWith("/")) start = 1; + if (str.endsWith("/")) end = str.length - 1; + + return start === 0 && end === str.length ? str : str.slice(start, end); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts new file mode 100644 index 000000000000..13e89be9d9a6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/core/url/qs.ts @@ -0,0 +1,74 @@ +interface QueryStringOptions { + arrayFormat?: "indices" | "repeat"; + encode?: boolean; +} + +const defaultQsOptions: Required = { + arrayFormat: "indices", + encode: true, +} as const; + +function encodeValue(value: unknown, shouldEncode: boolean): string { + if (value === undefined) { + return ""; + } + if (value === null) { + return ""; + } + const stringValue = String(value); + return shouldEncode ? encodeURIComponent(stringValue) : stringValue; +} + +function stringifyObject(obj: Record, prefix = "", options: Required): string[] { + const parts: string[] = []; + + for (const [key, value] of Object.entries(obj)) { + const fullKey = prefix ? `${prefix}[${key}]` : key; + + if (value === undefined) { + continue; + } + + if (Array.isArray(value)) { + if (value.length === 0) { + continue; + } + for (let i = 0; i < value.length; i++) { + const item = value[i]; + if (item === undefined) { + continue; + } + if (typeof item === "object" && !Array.isArray(item) && item !== null) { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + parts.push(...stringifyObject(item as Record, arrayKey, options)); + } else { + const arrayKey = options.arrayFormat === "indices" ? `${fullKey}[${i}]` : fullKey; + const encodedKey = options.encode ? encodeURIComponent(arrayKey) : arrayKey; + parts.push(`${encodedKey}=${encodeValue(item, options.encode)}`); + } + } + } else if (typeof value === "object" && value !== null) { + if (Object.keys(value as Record).length === 0) { + continue; + } + parts.push(...stringifyObject(value as Record, fullKey, options)); + } else { + const encodedKey = options.encode ? encodeURIComponent(fullKey) : fullKey; + parts.push(`${encodedKey}=${encodeValue(value, options.encode)}`); + } + } + + return parts; +} + +export function toQueryString(obj: unknown, options?: QueryStringOptions): string { + if (obj == null || typeof obj !== "object") { + return ""; + } + + const parts = stringifyObject(obj as Record, "", { + ...defaultQsOptions, + ...options, + }); + return parts.join("&"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts new file mode 100644 index 000000000000..d2e515f5d4e2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveError.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import { toJson } from "../core/json.js"; + +export class SeedExhaustiveError extends Error { + public readonly statusCode?: number; + public readonly body?: unknown; + public readonly rawResponse?: core.RawResponse; + + constructor({ + message, + statusCode, + body, + rawResponse, + }: { + message?: string; + statusCode?: number; + body?: unknown; + rawResponse?: core.RawResponse; + }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + this.statusCode = statusCode; + this.body = body; + this.rawResponse = rawResponse; + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + const lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${toJson(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts new file mode 100644 index 000000000000..82a3cb8de266 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/SeedExhaustiveTimeoutError.ts @@ -0,0 +1,13 @@ +// This file was auto-generated by Fern from our API Definition. + +export class SeedExhaustiveTimeoutError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts new file mode 100644 index 000000000000..deb55c602654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/handleNonStatusCodeError.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as core from "../core/index.js"; +import * as errors from "./index.js"; + +export function handleNonStatusCodeError( + error: core.Fetcher.Error, + rawResponse: core.RawResponse, + method: string, + path: string, +): never { + switch (error.reason) { + case "non-json": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + body: error.rawBody, + rawResponse: rawResponse, + }); + case "body-is-null": + throw new errors.SeedExhaustiveError({ + statusCode: error.statusCode, + rawResponse: rawResponse, + }); + case "timeout": + throw new errors.SeedExhaustiveTimeoutError(`Timeout exceeded when calling ${method} ${path}.`); + case "unknown": + throw new errors.SeedExhaustiveError({ + message: error.errorMessage, + rawResponse: rawResponse, + }); + default: + throw new errors.SeedExhaustiveError({ + message: "Unknown error", + rawResponse: rawResponse, + }); + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts new file mode 100644 index 000000000000..2e2853073a94 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/errors/index.ts @@ -0,0 +1,2 @@ +export { SeedExhaustiveError } from "./SeedExhaustiveError.js"; +export { SeedExhaustiveTimeoutError } from "./SeedExhaustiveTimeoutError.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts new file mode 100644 index 000000000000..7b70ee14fc02 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/exports.ts @@ -0,0 +1 @@ +export * from "./core/exports.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts new file mode 100644 index 000000000000..9f0bdd34e0d5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/index.ts @@ -0,0 +1,6 @@ +export * as SeedExhaustive from "./api/index.js"; +export type { BaseClientOptions, BaseRequestOptions } from "./BaseClient.js"; +export { SeedExhaustiveClient } from "./Client.js"; +export { SeedExhaustiveError, SeedExhaustiveTimeoutError } from "./errors/index.js"; +export * from "./exports.js"; +export * as serialization from "./serialization/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts new file mode 100644 index 000000000000..e37f244ea60c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfObjects.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfObjects.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfObjects.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts new file mode 100644 index 000000000000..668b72ec3402 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnListOfPrimitives.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfPrimitives.Request.Raw, + string[] +> = core.serialization.list(core.serialization.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnListOfPrimitives.Response.Raw, + string[] +> = core.serialization.list(core.serialization.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts new file mode 100644 index 000000000000..242978c11a34 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapOfPrimToObject.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Request.Raw, + Record +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapOfPrimToObject.Response.Raw, + Record +> = core.serialization.record(core.serialization.string(), ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts new file mode 100644 index 000000000000..9003c1ac3676 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnMapPrimToPrim.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapPrimToPrim.Request.Raw, + Record +> = core.serialization.record(core.serialization.string(), core.serialization.string()); + +export declare namespace Request { + export type Raw = Record; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnMapPrimToPrim.Response.Raw, + Record +> = core.serialization.record(core.serialization.string(), core.serialization.string()); + +export declare namespace Response { + export type Raw = Record; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts new file mode 100644 index 000000000000..b7e20374f571 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnOptional.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import type * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnOptional.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField | undefined +> = ObjectWithRequiredField.optional(); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnOptional.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField | undefined +> = ObjectWithRequiredField.optional(); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts new file mode 100644 index 000000000000..4792425484f1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfObjects.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithRequiredField } from "../../../../types/resources/object/types/ObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfObjects.Request.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Request { + export type Raw = ObjectWithRequiredField.Raw[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfObjects.Response.Raw, + SeedExhaustive.types.ObjectWithRequiredField[] +> = core.serialization.list(ObjectWithRequiredField); + +export declare namespace Response { + export type Raw = ObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts new file mode 100644 index 000000000000..53931f5e393e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/getAndReturnSetOfPrimitives.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfPrimitives.Request.Raw, + Set +> = core.serialization.set(core.serialization.string()); + +export declare namespace Request { + export type Raw = string[]; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.container.getAndReturnSetOfPrimitives.Response.Raw, + Set +> = core.serialization.set(core.serialization.string()); + +export declare namespace Response { + export type Raw = string[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts new file mode 100644 index 000000000000..1972f5b270f4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/client/index.ts @@ -0,0 +1,7 @@ +export * as getAndReturnListOfObjects from "./getAndReturnListOfObjects.js"; +export * as getAndReturnListOfPrimitives from "./getAndReturnListOfPrimitives.js"; +export * as getAndReturnMapOfPrimToObject from "./getAndReturnMapOfPrimToObject.js"; +export * as getAndReturnMapPrimToPrim from "./getAndReturnMapPrimToPrim.js"; +export * as getAndReturnOptional from "./getAndReturnOptional.js"; +export * as getAndReturnSetOfObjects from "./getAndReturnSetOfObjects.js"; +export * as getAndReturnSetOfPrimitives from "./getAndReturnSetOfPrimitives.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/container/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts new file mode 100644 index 000000000000..e053119b972c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/index.ts @@ -0,0 +1,2 @@ +export * as testDelete from "./testDelete.js"; +export * as testGet from "./testGet.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts new file mode 100644 index 000000000000..b6273278aa1f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testDelete.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts new file mode 100644 index 000000000000..a642aa120d8b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/client/testGet.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/httpMethods/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts new file mode 100644 index 000000000000..cd7e640937da --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/index.ts @@ -0,0 +1,8 @@ +export * as container from "./container/index.js"; +export * as httpMethods from "./httpMethods/index.js"; +export * as object from "./object/index.js"; +export * as params from "./params/index.js"; +export * as primitive from "./primitive/index.js"; +export * as put from "./put/index.js"; +export * from "./put/types/index.js"; +export * as urls from "./urls/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts new file mode 100644 index 000000000000..60f40db3f33b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/getAndReturnNestedWithRequiredFieldAsList.ts @@ -0,0 +1,15 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { NestedObjectWithRequiredField } from "../../../../types/resources/object/types/NestedObjectWithRequiredField.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.object.getAndReturnNestedWithRequiredFieldAsList.Request.Raw, + SeedExhaustive.types.NestedObjectWithRequiredField[] +> = core.serialization.list(NestedObjectWithRequiredField); + +export declare namespace Request { + export type Raw = NestedObjectWithRequiredField.Raw[]; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts new file mode 100644 index 000000000000..d00c4c582910 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/client/index.ts @@ -0,0 +1 @@ +export * as getAndReturnNestedWithRequiredFieldAsList from "./getAndReturnNestedWithRequiredFieldAsList.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts new file mode 100644 index 000000000000..c82dda746e5a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithInlinePath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts new file mode 100644 index 000000000000..da8888318c5b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/getWithPath.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts new file mode 100644 index 000000000000..b30603cae602 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/index.ts @@ -0,0 +1,4 @@ +export * as getWithInlinePath from "./getWithInlinePath.js"; +export * as getWithPath from "./getWithPath.js"; +export * as modifyWithInlinePath from "./modifyWithInlinePath.js"; +export * as modifyWithPath from "./modifyWithPath.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts new file mode 100644 index 000000000000..b84b3f790f22 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithInlinePath.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.params.modifyWithInlinePath.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts new file mode 100644 index 000000000000..8369d9dae207 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/client/modifyWithPath.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/params/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts new file mode 100644 index 000000000000..eb7fdb1065fb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBase64.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Request.Raw, + string +> = core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBase64.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts new file mode 100644 index 000000000000..f51fb5f9e891 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnBool.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Request { + export type Raw = boolean; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnBool.Response.Raw, + boolean +> = core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts new file mode 100644 index 000000000000..08ac416d1caf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDate.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDate.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts new file mode 100644 index 000000000000..a80c46b7f418 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDatetime.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Request.Raw, + Date +> = core.serialization.date(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDatetime.Response.Raw, + Date +> = core.serialization.date(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts new file mode 100644 index 000000000000..bba9c504ff71 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnDouble.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Request.Raw, + number +> = core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnDouble.Response.Raw, + number +> = core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts new file mode 100644 index 000000000000..552fe3843ef9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnInt.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts new file mode 100644 index 000000000000..191eda735e47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnLong.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.number(); + +export declare namespace Request { + export type Raw = number; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnLong.Response.Raw, + number +> = core.serialization.number(); + +export declare namespace Response { + export type Raw = number; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts new file mode 100644 index 000000000000..f75bf59ba909 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnString.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Request.Raw, + string +> = core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnString.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts new file mode 100644 index 000000000000..64875010a017 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/getAndReturnUuid.ts @@ -0,0 +1,20 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} + +export const Response: core.serialization.Schema< + serializers.endpoints.primitive.getAndReturnUuid.Response.Raw, + string +> = core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts new file mode 100644 index 000000000000..9805ab86b129 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/client/index.ts @@ -0,0 +1,9 @@ +export * as getAndReturnBase64 from "./getAndReturnBase64.js"; +export * as getAndReturnBool from "./getAndReturnBool.js"; +export * as getAndReturnDate from "./getAndReturnDate.js"; +export * as getAndReturnDatetime from "./getAndReturnDatetime.js"; +export * as getAndReturnDouble from "./getAndReturnDouble.js"; +export * as getAndReturnInt from "./getAndReturnInt.js"; +export * as getAndReturnLong from "./getAndReturnLong.js"; +export * as getAndReturnString from "./getAndReturnString.js"; +export * as getAndReturnUuid from "./getAndReturnUuid.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/primitive/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts new file mode 100644 index 000000000000..47e249372cff --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCategory.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCategory: core.serialization.Schema< + serializers.endpoints.ErrorCategory.Raw, + SeedExhaustive.endpoints.ErrorCategory +> = core.serialization.enum_(["API_ERROR", "AUTHENTICATION_ERROR", "INVALID_REQUEST_ERROR"]); + +export declare namespace ErrorCategory { + export type Raw = "API_ERROR" | "AUTHENTICATION_ERROR" | "INVALID_REQUEST_ERROR"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts new file mode 100644 index 000000000000..a36b10d4b362 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/ErrorCode.ts @@ -0,0 +1,37 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ErrorCode: core.serialization.Schema< + serializers.endpoints.ErrorCode.Raw, + SeedExhaustive.endpoints.ErrorCode +> = core.serialization.enum_([ + "INTERNAL_SERVER_ERROR", + "UNAUTHORIZED", + "FORBIDDEN", + "BAD_REQUEST", + "CONFLICT", + "GONE", + "UNPROCESSABLE_ENTITY", + "NOT_IMPLEMENTED", + "BAD_GATEWAY", + "SERVICE_UNAVAILABLE", + "Unknown", +]); + +export declare namespace ErrorCode { + export type Raw = + | "INTERNAL_SERVER_ERROR" + | "UNAUTHORIZED" + | "FORBIDDEN" + | "BAD_REQUEST" + | "CONFLICT" + | "GONE" + | "UNPROCESSABLE_ENTITY" + | "NOT_IMPLEMENTED" + | "BAD_GATEWAY" + | "SERVICE_UNAVAILABLE" + | "Unknown"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts new file mode 100644 index 000000000000..59ab664d43a2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/Error_.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ErrorCategory } from "./ErrorCategory.js"; +import { ErrorCode } from "./ErrorCode.js"; + +export const Error_: core.serialization.ObjectSchema< + serializers.endpoints.Error_.Raw, + SeedExhaustive.endpoints.Error_ +> = core.serialization.object({ + category: ErrorCategory, + code: ErrorCode, + detail: core.serialization.string().optional(), + field: core.serialization.string().optional(), +}); + +export declare namespace Error_ { + export interface Raw { + category: ErrorCategory.Raw; + code: ErrorCode.Raw; + detail?: string | null; + field?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts new file mode 100644 index 000000000000..17af0986c151 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/PutResponse.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Error_ } from "./Error_.js"; + +export const PutResponse: core.serialization.ObjectSchema< + serializers.endpoints.PutResponse.Raw, + SeedExhaustive.endpoints.PutResponse +> = core.serialization.object({ + errors: core.serialization.list(Error_).optional(), +}); + +export declare namespace PutResponse { + export interface Raw { + errors?: Error_.Raw[] | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts new file mode 100644 index 000000000000..3293f66bb34c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/put/types/index.ts @@ -0,0 +1,4 @@ +export * from "./Error_.js"; +export * from "./ErrorCategory.js"; +export * from "./ErrorCode.js"; +export * from "./PutResponse.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts new file mode 100644 index 000000000000..66e101cdc2d7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/index.ts @@ -0,0 +1,4 @@ +export * as noEndingSlash from "./noEndingSlash.js"; +export * as withEndingSlash from "./withEndingSlash.js"; +export * as withMixedCase from "./withMixedCase.js"; +export * as withUnderscores from "./withUnderscores.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts new file mode 100644 index 000000000000..2b0a2cfbfa53 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/noEndingSlash.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts new file mode 100644 index 000000000000..de39ec7a2a0d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withEndingSlash.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts new file mode 100644 index 000000000000..ffedf860047a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withMixedCase.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts new file mode 100644 index 000000000000..8d308fd3e42f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/client/withUnderscores.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/endpoints/resources/urls/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts new file mode 100644 index 000000000000..5d81697cccfb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/BadObjectRequestInfo.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../api/index.js"; +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const BadObjectRequestInfo: core.serialization.ObjectSchema< + serializers.BadObjectRequestInfo.Raw, + SeedExhaustive.BadObjectRequestInfo +> = core.serialization.object({ + message: core.serialization.string(), +}); + +export declare namespace BadObjectRequestInfo { + export interface Raw { + message: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts new file mode 100644 index 000000000000..b10afa3b7749 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/generalErrors/types/index.ts @@ -0,0 +1 @@ +export * from "./BadObjectRequestInfo.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts new file mode 100644 index 000000000000..20b614a89e2f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/index.ts @@ -0,0 +1,9 @@ +export * as endpoints from "./endpoints/index.js"; +export * as generalErrors from "./generalErrors/index.js"; +export * from "./generalErrors/types/index.js"; +export * from "./inlinedRequests/client/requests/index.js"; +export * as inlinedRequests from "./inlinedRequests/index.js"; +export * as noAuth from "./noAuth/index.js"; +export * as noReqBody from "./noReqBody/index.js"; +export * as reqWithHeaders from "./reqWithHeaders/index.js"; +export * as types from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts new file mode 100644 index 000000000000..195f9aa8a846 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/index.ts @@ -0,0 +1 @@ +export * from "./requests/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts new file mode 100644 index 000000000000..d8c20c33277a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/PostWithObjectBody.ts @@ -0,0 +1,23 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../api/index.js"; +import * as core from "../../../../../core/index.js"; +import type * as serializers from "../../../../index.js"; +import { ObjectWithOptionalField } from "../../../types/resources/object/types/ObjectWithOptionalField.js"; + +export const PostWithObjectBody: core.serialization.Schema< + serializers.PostWithObjectBody.Raw, + SeedExhaustive.PostWithObjectBody +> = core.serialization.object({ + string: core.serialization.string(), + integer: core.serialization.number(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +}); + +export declare namespace PostWithObjectBody { + export interface Raw { + string: string; + integer: number; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts new file mode 100644 index 000000000000..d62a81ce61fd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/client/requests/index.ts @@ -0,0 +1 @@ +export { PostWithObjectBody } from "./PostWithObjectBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/inlinedRequests/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts new file mode 100644 index 000000000000..549edcdba7f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoAuth from "./postWithNoAuth.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts new file mode 100644 index 000000000000..8e7617816edf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/client/postWithNoAuth.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.boolean(); + +export declare namespace Response { + export type Raw = boolean; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noAuth/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts new file mode 100644 index 000000000000..b62616349ec6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/index.ts @@ -0,0 +1 @@ +export * as postWithNoRequestBody from "./postWithNoRequestBody.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts new file mode 100644 index 000000000000..c0cba3668202 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/client/postWithNoRequestBody.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Response: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Response { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/noReqBody/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts new file mode 100644 index 000000000000..70ac5077c6f2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/getWithCustomHeader.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as core from "../../../../core/index.js"; +import type * as serializers from "../../../index.js"; + +export const Request: core.serialization.Schema = + core.serialization.string(); + +export declare namespace Request { + export type Raw = string; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts new file mode 100644 index 000000000000..fb7f25afb170 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/client/index.ts @@ -0,0 +1 @@ +export * as getWithCustomHeader from "./getWithCustomHeader.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts new file mode 100644 index 000000000000..914b8c3c7214 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/reqWithHeaders/index.ts @@ -0,0 +1 @@ +export * from "./client/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts new file mode 100644 index 000000000000..e445af0d831e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/index.ts @@ -0,0 +1 @@ +export * from "./resources/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts new file mode 100644 index 000000000000..ab35ed9023bd --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/ObjectWithDocs.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithDocs: core.serialization.ObjectSchema< + serializers.types.ObjectWithDocs.Raw, + SeedExhaustive.types.ObjectWithDocs +> = core.serialization.object({ + string: core.serialization.string(), +}); + +export declare namespace ObjectWithDocs { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts new file mode 100644 index 000000000000..3eedfcba912c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/docs/types/index.ts @@ -0,0 +1 @@ +export * from "./ObjectWithDocs.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts new file mode 100644 index 000000000000..96a37eda2a46 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/WeatherReport.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const WeatherReport: core.serialization.Schema< + serializers.types.WeatherReport.Raw, + SeedExhaustive.types.WeatherReport +> = core.serialization.enum_(["SUNNY", "CLOUDY", "RAINING", "SNOWING"]); + +export declare namespace WeatherReport { + export type Raw = "SUNNY" | "CLOUDY" | "RAINING" | "SNOWING"; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts new file mode 100644 index 000000000000..3b2d63911a15 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/enum/types/index.ts @@ -0,0 +1 @@ +export * from "./WeatherReport.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts new file mode 100644 index 000000000000..52175f3cee16 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/index.ts @@ -0,0 +1,8 @@ +export * as docs from "./docs/index.js"; +export * from "./docs/types/index.js"; +export * as enum_ from "./enum/index.js"; +export * from "./enum/types/index.js"; +export * as object from "./object/index.js"; +export * from "./object/types/index.js"; +export * as union from "./union/index.js"; +export * from "./union/types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts new file mode 100644 index 000000000000..e8e0fd387243 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/DoubleOptional.ts @@ -0,0 +1,19 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { OptionalAlias } from "./OptionalAlias.js"; + +export const DoubleOptional: core.serialization.ObjectSchema< + serializers.types.DoubleOptional.Raw, + SeedExhaustive.types.DoubleOptional +> = core.serialization.object({ + optionalAlias: OptionalAlias.optional(), +}); + +export declare namespace DoubleOptional { + export interface Raw { + optionalAlias?: (OptionalAlias.Raw | undefined) | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts new file mode 100644 index 000000000000..c754d9aba654 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithOptionalField.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithOptionalField: core.serialization.ObjectSchema< + serializers.types.NestedObjectWithOptionalField.Raw, + SeedExhaustive.types.NestedObjectWithOptionalField +> = core.serialization.object({ + string: core.serialization.string().optional(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField.optional()), +}); + +export declare namespace NestedObjectWithOptionalField { + export interface Raw { + string?: string | null; + NestedObject?: ObjectWithOptionalField.Raw | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts new file mode 100644 index 000000000000..cd443843bf86 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/NestedObjectWithRequiredField.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { ObjectWithOptionalField } from "./ObjectWithOptionalField.js"; + +export const NestedObjectWithRequiredField: core.serialization.ObjectSchema< + serializers.types.NestedObjectWithRequiredField.Raw, + SeedExhaustive.types.NestedObjectWithRequiredField +> = core.serialization.object({ + string: core.serialization.string(), + nestedObject: core.serialization.property("NestedObject", ObjectWithOptionalField), +}); + +export declare namespace NestedObjectWithRequiredField { + export interface Raw { + string: string; + NestedObject: ObjectWithOptionalField.Raw; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts new file mode 100644 index 000000000000..c7426a9b9847 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithMapOfMap.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithMapOfMap: core.serialization.ObjectSchema< + serializers.types.ObjectWithMapOfMap.Raw, + SeedExhaustive.types.ObjectWithMapOfMap +> = core.serialization.object({ + map: core.serialization.record( + core.serialization.string(), + core.serialization.record(core.serialization.string(), core.serialization.string()), + ), +}); + +export declare namespace ObjectWithMapOfMap { + export interface Raw { + map: Record>; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts new file mode 100644 index 000000000000..44a200707fd8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithOptionalField.ts @@ -0,0 +1,42 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithOptionalField: core.serialization.ObjectSchema< + serializers.types.ObjectWithOptionalField.Raw, + SeedExhaustive.types.ObjectWithOptionalField +> = core.serialization.object({ + string: core.serialization.string().optional(), + integer: core.serialization.number().optional(), + long: core.serialization.number().optional(), + double: core.serialization.number().optional(), + bool: core.serialization.boolean().optional(), + datetime: core.serialization.date().optional(), + date: core.serialization.string().optional(), + uuid: core.serialization.string().optional(), + base64: core.serialization.string().optional(), + list: core.serialization.list(core.serialization.string()).optional(), + set: core.serialization.set(core.serialization.string()).optional(), + map: core.serialization.record(core.serialization.number(), core.serialization.string()).optional(), + bigint: core.serialization.string().optional(), +}); + +export declare namespace ObjectWithOptionalField { + export interface Raw { + string?: string | null; + integer?: number | null; + long?: number | null; + double?: number | null; + bool?: boolean | null; + datetime?: string | null; + date?: string | null; + uuid?: string | null; + base64?: string | null; + list?: string[] | null; + set?: string[] | null; + map?: Record | null; + bigint?: string | null; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts new file mode 100644 index 000000000000..b6887e41337d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/ObjectWithRequiredField.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const ObjectWithRequiredField: core.serialization.ObjectSchema< + serializers.types.ObjectWithRequiredField.Raw, + SeedExhaustive.types.ObjectWithRequiredField +> = core.serialization.object({ + string: core.serialization.string(), +}); + +export declare namespace ObjectWithRequiredField { + export interface Raw { + string: string; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts new file mode 100644 index 000000000000..a7798d5904bf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/OptionalAlias.ts @@ -0,0 +1,14 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const OptionalAlias: core.serialization.Schema< + serializers.types.OptionalAlias.Raw, + SeedExhaustive.types.OptionalAlias +> = core.serialization.string().optional(); + +export declare namespace OptionalAlias { + export type Raw = string | null | undefined; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts new file mode 100644 index 000000000000..c3c65c311b82 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/object/types/index.ts @@ -0,0 +1,7 @@ +export * from "./DoubleOptional.js"; +export * from "./NestedObjectWithOptionalField.js"; +export * from "./NestedObjectWithRequiredField.js"; +export * from "./ObjectWithMapOfMap.js"; +export * from "./ObjectWithOptionalField.js"; +export * from "./ObjectWithRequiredField.js"; +export * from "./OptionalAlias.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts new file mode 100644 index 000000000000..2f88e3015854 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/index.ts @@ -0,0 +1 @@ +export * from "./types/index.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts new file mode 100644 index 000000000000..83b27d0bb69d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Animal.ts @@ -0,0 +1,30 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; +import { Cat } from "./Cat.js"; +import { Dog } from "./Dog.js"; + +export const Animal: core.serialization.Schema = + core.serialization + .union("animal", { + dog: Dog, + cat: Cat, + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); + +export declare namespace Animal { + export type Raw = Animal.Dog | Animal.Cat; + + export interface Dog extends Dog.Raw { + animal: "dog"; + } + + export interface Cat extends Cat.Raw { + animal: "cat"; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts new file mode 100644 index 000000000000..16f8a2006e5c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Cat.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Cat: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToMeow: core.serialization.boolean(), + }); + +export declare namespace Cat { + export interface Raw { + name: string; + likesToMeow: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts new file mode 100644 index 000000000000..271a1f3a4afa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/Dog.ts @@ -0,0 +1,18 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedExhaustive from "../../../../../../api/index.js"; +import * as core from "../../../../../../core/index.js"; +import type * as serializers from "../../../../../index.js"; + +export const Dog: core.serialization.ObjectSchema = + core.serialization.object({ + name: core.serialization.string(), + likesToWoof: core.serialization.boolean(), + }); + +export declare namespace Dog { + export interface Raw { + name: string; + likesToWoof: boolean; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts new file mode 100644 index 000000000000..342e90adc057 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/serialization/resources/types/resources/union/types/index.ts @@ -0,0 +1,3 @@ +export * from "./Animal.js"; +export * from "./Cat.js"; +export * from "./Dog.js"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts new file mode 100644 index 000000000000..b643a3e3ea27 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/src/version.ts @@ -0,0 +1 @@ +export const SDK_VERSION = "0.0.1"; diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts new file mode 100644 index 000000000000..7f5e031c8396 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/custom.test.ts @@ -0,0 +1,13 @@ +/** + * This is a custom test file, if you wish to add more tests + * to your SDK. + * Be sure to mark this file in `.fernignore`. + * + * If you include example requests/responses in your fern definition, + * you will have tests automatically generated for you. + */ +describe("test", () => { + it("default", () => { + expect(true).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts new file mode 100644 index 000000000000..954872157d52 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServer.ts @@ -0,0 +1,29 @@ +import type { RequestHandlerOptions } from "msw"; +import type { SetupServer } from "msw/node"; + +import { mockEndpointBuilder } from "./mockEndpointBuilder"; + +export interface MockServerOptions { + baseUrl: string; + server: SetupServer; +} + +export class MockServer { + private readonly server: SetupServer; + public readonly baseUrl: string; + + constructor({ baseUrl, server }: MockServerOptions) { + this.baseUrl = baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl; + this.server = server; + } + + public mockEndpoint(options?: RequestHandlerOptions): ReturnType { + const builder = mockEndpointBuilder({ + once: options?.once ?? true, + onBuild: (handler) => { + this.server.use(handler); + }, + }).baseUrl(this.baseUrl); + return builder; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts new file mode 100644 index 000000000000..e1a90f7fb2e3 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/MockServerPool.ts @@ -0,0 +1,106 @@ +import { setupServer } from "msw/node"; + +import { fromJson, toJson } from "../../src/core/json"; +import { MockServer } from "./MockServer"; +import { randomBaseUrl } from "./randomBaseUrl"; + +const mswServer = setupServer(); +interface MockServerOptions { + baseUrl?: string; +} + +async function formatHttpRequest(request: Request, id?: string): Promise { + try { + const clone = request.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Request ${id} ###\n` : ""; + const firstLine = `${title}${request.method} ${request.url.toString()} HTTP/1.1`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting request: ${e}`; + } +} + +async function formatHttpResponse(response: Response, id?: string): Promise { + try { + const clone = response.clone(); + const headers = [...clone.headers.entries()].map(([k, v]) => `${k}: ${v}`).join("\n"); + + let body = ""; + try { + const contentType = clone.headers.get("content-type"); + if (contentType?.includes("application/json")) { + body = toJson(fromJson(await clone.text()), undefined, 2); + } else if (clone.body) { + body = await clone.text(); + } + } catch (_e) { + body = "(unable to parse body)"; + } + + const title = id ? `### Response for ${id} ###\n` : ""; + const firstLine = `${title}HTTP/1.1 ${response.status} ${response.statusText}`; + + return `\n${firstLine}\n${headers}\n\n${body || "(no body)"}\n`; + } catch (e) { + return `Error formatting response: ${e}`; + } +} + +class MockServerPool { + private servers: MockServer[] = []; + + public createServer(options?: Partial): MockServer { + const baseUrl = options?.baseUrl || randomBaseUrl(); + const server = new MockServer({ baseUrl, server: mswServer }); + this.servers.push(server); + return server; + } + + public getServers(): MockServer[] { + return [...this.servers]; + } + + public listen(): void { + const onUnhandledRequest = process.env.LOG_LEVEL === "debug" ? "warn" : "bypass"; + mswServer.listen({ onUnhandledRequest }); + + if (process.env.LOG_LEVEL === "debug") { + mswServer.events.on("request:start", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:start\n${formattedRequest}`); + }); + + mswServer.events.on("request:unhandled", async ({ request, requestId }) => { + const formattedRequest = await formatHttpRequest(request, requestId); + console.debug(`request:unhandled\n${formattedRequest}`); + }); + + mswServer.events.on("response:mocked", async ({ request, response, requestId }) => { + const formattedResponse = await formatHttpResponse(response, requestId); + console.debug(`response:mocked\n${formattedResponse}`); + }); + } + } + + public close(): void { + this.servers = []; + mswServer.close(); + } +} + +export const mockServerPool = new MockServerPool(); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts new file mode 100644 index 000000000000..1b0e51079e6b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/mockEndpointBuilder.ts @@ -0,0 +1,227 @@ +import { type DefaultBodyType, type HttpHandler, HttpResponse, type HttpResponseResolver, http } from "msw"; + +import { url } from "../../src/core"; +import { toJson } from "../../src/core/json"; +import { withFormUrlEncoded } from "./withFormUrlEncoded"; +import { withHeaders } from "./withHeaders"; +import { withJson } from "./withJson"; + +type HttpMethod = "all" | "get" | "post" | "put" | "delete" | "patch" | "options" | "head"; + +interface MethodStage { + baseUrl(baseUrl: string): MethodStage; + all(path: string): RequestHeadersStage; + get(path: string): RequestHeadersStage; + post(path: string): RequestHeadersStage; + put(path: string): RequestHeadersStage; + delete(path: string): RequestHeadersStage; + patch(path: string): RequestHeadersStage; + options(path: string): RequestHeadersStage; + head(path: string): RequestHeadersStage; +} + +interface RequestHeadersStage extends RequestBodyStage, ResponseStage { + header(name: string, value: string): RequestHeadersStage; + headers(headers: Record): RequestBodyStage; +} + +interface RequestBodyStage extends ResponseStage { + jsonBody(body: unknown): ResponseStage; + formUrlEncodedBody(body: unknown): ResponseStage; +} + +interface ResponseStage { + respondWith(): ResponseStatusStage; +} +interface ResponseStatusStage { + statusCode(statusCode: number): ResponseHeaderStage; +} + +interface ResponseHeaderStage extends ResponseBodyStage, BuildStage { + header(name: string, value: string): ResponseHeaderStage; + headers(headers: Record): ResponseHeaderStage; +} + +interface ResponseBodyStage { + jsonBody(body: unknown): BuildStage; +} + +interface BuildStage { + build(): HttpHandler; +} + +export interface HttpHandlerBuilderOptions { + onBuild?: (handler: HttpHandler) => void; + once?: boolean; +} + +class RequestBuilder implements MethodStage, RequestHeadersStage, RequestBodyStage, ResponseStage { + private method: HttpMethod = "get"; + private _baseUrl: string = ""; + private path: string = "/"; + private readonly predicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[] = []; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + constructor(options?: HttpHandlerBuilderOptions) { + this.handlerOptions = options; + } + + baseUrl(baseUrl: string): MethodStage { + this._baseUrl = baseUrl; + return this; + } + + all(path: string): RequestHeadersStage { + this.method = "all"; + this.path = path; + return this; + } + + get(path: string): RequestHeadersStage { + this.method = "get"; + this.path = path; + return this; + } + + post(path: string): RequestHeadersStage { + this.method = "post"; + this.path = path; + return this; + } + + put(path: string): RequestHeadersStage { + this.method = "put"; + this.path = path; + return this; + } + + delete(path: string): RequestHeadersStage { + this.method = "delete"; + this.path = path; + return this; + } + + patch(path: string): RequestHeadersStage { + this.method = "patch"; + this.path = path; + return this; + } + + options(path: string): RequestHeadersStage { + this.method = "options"; + this.path = path; + return this; + } + + head(path: string): RequestHeadersStage { + this.method = "head"; + this.path = path; + return this; + } + + header(name: string, value: string): RequestHeadersStage { + this.predicates.push((resolver) => withHeaders({ [name]: value }, resolver)); + return this; + } + + headers(headers: Record): RequestBodyStage { + this.predicates.push((resolver) => withHeaders(headers, resolver)); + return this; + } + + jsonBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you want an empty body."); + } + this.predicates.push((resolver) => withJson(body, resolver)); + return this; + } + + formUrlEncodedBody(body: unknown): ResponseStage { + if (body === undefined) { + throw new Error( + "Undefined is not valid for form-urlencoded. Do not call formUrlEncodedBody if you want an empty body.", + ); + } + this.predicates.push((resolver) => withFormUrlEncoded(body, resolver)); + return this; + } + + respondWith(): ResponseStatusStage { + return new ResponseBuilder(this.method, this.buildUrl(), this.predicates, this.handlerOptions); + } + + private buildUrl(): string { + return url.join(this._baseUrl, this.path); + } +} + +class ResponseBuilder implements ResponseStatusStage, ResponseHeaderStage, ResponseBodyStage, BuildStage { + private readonly method: HttpMethod; + private readonly url: string; + private readonly requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[]; + private readonly handlerOptions?: HttpHandlerBuilderOptions; + + private responseStatusCode: number = 200; + private responseHeaders: Record = {}; + private responseBody: DefaultBodyType = undefined; + + constructor( + method: HttpMethod, + url: string, + requestPredicates: ((resolver: HttpResponseResolver) => HttpResponseResolver)[], + options?: HttpHandlerBuilderOptions, + ) { + this.method = method; + this.url = url; + this.requestPredicates = requestPredicates; + this.handlerOptions = options; + } + + public statusCode(code: number): ResponseHeaderStage { + this.responseStatusCode = code; + return this; + } + + public header(name: string, value: string): ResponseHeaderStage { + this.responseHeaders[name] = value; + return this; + } + + public headers(headers: Record): ResponseHeaderStage { + this.responseHeaders = { ...this.responseHeaders, ...headers }; + return this; + } + + public jsonBody(body: unknown): BuildStage { + if (body === undefined) { + throw new Error("Undefined is not valid JSON. Do not call jsonBody if you expect an empty body."); + } + this.responseBody = toJson(body); + return this; + } + + public build(): HttpHandler { + const responseResolver: HttpResponseResolver = () => { + const response = new HttpResponse(this.responseBody, { + status: this.responseStatusCode, + headers: this.responseHeaders, + }); + // if no Content-Type header is set, delete the default text content type that is set + if (Object.keys(this.responseHeaders).some((key) => key.toLowerCase() === "content-type") === false) { + response.headers.delete("Content-Type"); + } + return response; + }; + + const finalResolver = this.requestPredicates.reduceRight((acc, predicate) => predicate(acc), responseResolver); + + const handler = http[this.method](this.url, finalResolver, this.handlerOptions); + this.handlerOptions?.onBuild?.(handler); + return handler; + } +} + +export function mockEndpointBuilder(options?: HttpHandlerBuilderOptions): MethodStage { + return new RequestBuilder(options); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts new file mode 100644 index 000000000000..031aa6408aca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/randomBaseUrl.ts @@ -0,0 +1,4 @@ +export function randomBaseUrl(): string { + const randomString = Math.random().toString(36).substring(2, 15); + return `http://${randomString}.localhost`; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts new file mode 100644 index 000000000000..aeb3a95af7dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/setup.ts @@ -0,0 +1,10 @@ +import { afterAll, beforeAll } from "vitest"; + +import { mockServerPool } from "./MockServerPool"; + +beforeAll(() => { + mockServerPool.listen(); +}); +afterAll(() => { + mockServerPool.close(); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts new file mode 100644 index 000000000000..e9e6ff2d9cf1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withFormUrlEncoded.ts @@ -0,0 +1,80 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request form-urlencoded body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withFormUrlEncoded(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: Record; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a form-urlencoded body."); + return passthrough(); + } + const params = new URLSearchParams(bodyText); + actualBody = {}; + for (const [key, value] of params.entries()) { + actualBody[key] = value; + } + } catch (error) { + console.error(`Error processing form-urlencoded request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).length > 0) { + console.error("Form-urlencoded body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + return { value: { actual, expected } }; + } + return {}; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if (actual[key] !== expected[key]) { + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts new file mode 100644 index 000000000000..6599d2b4a92d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withHeaders.ts @@ -0,0 +1,70 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +/** + * Creates a request matcher that validates if request headers match specified criteria + * @param expectedHeaders - Headers to match against + * @param resolver - Response resolver to execute if headers match + */ +export function withHeaders( + expectedHeaders: Record boolean)>, + resolver: HttpResponseResolver, +): HttpResponseResolver { + return (args) => { + const { request } = args; + const { headers } = request; + + const mismatches: Record< + string, + { actual: string | null; expected: string | RegExp | ((value: string) => boolean) } + > = {}; + + for (const [key, expectedValue] of Object.entries(expectedHeaders)) { + const actualValue = headers.get(key); + + if (actualValue === null) { + mismatches[key] = { actual: null, expected: expectedValue }; + continue; + } + + if (typeof expectedValue === "function") { + if (!expectedValue(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue instanceof RegExp) { + if (!expectedValue.test(actualValue)) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } else if (expectedValue !== actualValue) { + mismatches[key] = { actual: actualValue, expected: expectedValue }; + } + } + + if (Object.keys(mismatches).length > 0) { + const formattedMismatches = formatHeaderMismatches(mismatches); + console.error("Header mismatch:", formattedMismatches); + return passthrough(); + } + + return resolver(args); + }; +} + +function formatHeaderMismatches( + mismatches: Record boolean) }>, +): Record { + const formatted: Record = {}; + + for (const [key, { actual, expected }] of Object.entries(mismatches)) { + formatted[key] = { + actual, + expected: + expected instanceof RegExp + ? expected.toString() + : typeof expected === "function" + ? "[Function]" + : expected, + }; + } + + return formatted; +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts new file mode 100644 index 000000000000..b627638b015f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/mock-server/withJson.ts @@ -0,0 +1,158 @@ +import { type HttpResponseResolver, passthrough } from "msw"; + +import { fromJson, toJson } from "../../src/core/json"; + +/** + * Creates a request matcher that validates if the request JSON body exactly matches the expected object + * @param expectedBody - The exact body object to match against + * @param resolver - Response resolver to execute if body matches + */ +export function withJson(expectedBody: unknown, resolver: HttpResponseResolver): HttpResponseResolver { + return async (args) => { + const { request } = args; + + let clonedRequest: Request; + let bodyText: string | undefined; + let actualBody: unknown; + try { + clonedRequest = request.clone(); + bodyText = await clonedRequest.text(); + if (bodyText === "") { + console.error("Request body is empty, expected a JSON object."); + return passthrough(); + } + actualBody = fromJson(bodyText); + } catch (error) { + console.error(`Error processing request body:\n\tError: ${error}\n\tBody: ${bodyText}`); + return passthrough(); + } + + const mismatches = findMismatches(actualBody, expectedBody); + if (Object.keys(mismatches).filter((key) => !key.startsWith("pagination.")).length > 0) { + console.error("JSON body mismatch:", toJson(mismatches, undefined, 2)); + return passthrough(); + } + + return resolver(args); + }; +} + +function findMismatches(actual: any, expected: any): Record { + const mismatches: Record = {}; + + if (typeof actual !== typeof expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + + if (typeof actual !== "object" || actual === null || expected === null) { + if (actual !== expected) { + if (areEquivalent(actual, expected)) { + return {}; + } + return { value: { actual, expected } }; + } + return {}; + } + + if (Array.isArray(actual) && Array.isArray(expected)) { + if (actual.length !== expected.length) { + return { length: { actual: actual.length, expected: expected.length } }; + } + + const arrayMismatches: Record = {}; + for (let i = 0; i < actual.length; i++) { + const itemMismatches = findMismatches(actual[i], expected[i]); + if (Object.keys(itemMismatches).length > 0) { + for (const [mismatchKey, mismatchValue] of Object.entries(itemMismatches)) { + arrayMismatches[`[${i}]${mismatchKey === "value" ? "" : `.${mismatchKey}`}`] = mismatchValue; + } + } + } + return arrayMismatches; + } + + const actualKeys = Object.keys(actual); + const expectedKeys = Object.keys(expected); + + const allKeys = new Set([...actualKeys, ...expectedKeys]); + + for (const key of allKeys) { + if (!expectedKeys.includes(key)) { + if (actual[key] === undefined) { + continue; // Skip undefined values in actual + } + mismatches[key] = { actual: actual[key], expected: undefined }; + } else if (!actualKeys.includes(key)) { + if (expected[key] === undefined) { + continue; // Skip undefined values in expected + } + mismatches[key] = { actual: undefined, expected: expected[key] }; + } else if ( + typeof actual[key] === "object" && + actual[key] !== null && + typeof expected[key] === "object" && + expected[key] !== null + ) { + const nestedMismatches = findMismatches(actual[key], expected[key]); + if (Object.keys(nestedMismatches).length > 0) { + for (const [nestedKey, nestedValue] of Object.entries(nestedMismatches)) { + mismatches[`${key}${nestedKey === "value" ? "" : `.${nestedKey}`}`] = nestedValue; + } + } + } else if (actual[key] !== expected[key]) { + if (areEquivalent(actual[key], expected[key])) { + continue; + } + mismatches[key] = { actual: actual[key], expected: expected[key] }; + } + } + + return mismatches; +} + +function areEquivalent(actual: unknown, expected: unknown): boolean { + if (actual === expected) { + return true; + } + if (isEquivalentBigInt(actual, expected)) { + return true; + } + if (isEquivalentDatetime(actual, expected)) { + return true; + } + return false; +} + +function isEquivalentBigInt(actual: unknown, expected: unknown) { + if (typeof actual === "number") { + actual = BigInt(actual); + } + if (typeof expected === "number") { + expected = BigInt(expected); + } + if (typeof actual === "bigint" && typeof expected === "bigint") { + return actual === expected; + } + return false; +} + +function isEquivalentDatetime(str1: unknown, str2: unknown): boolean { + if (typeof str1 !== "string" || typeof str2 !== "string") { + return false; + } + const isoDatePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + if (!isoDatePattern.test(str1) || !isoDatePattern.test(str2)) { + return false; + } + + try { + const date1 = new Date(str1).getTime(); + const date2 = new Date(str2).getTime(); + return date1 === date2; + } catch { + return false; + } +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts new file mode 100644 index 000000000000..a5651f81ba10 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/setup.ts @@ -0,0 +1,80 @@ +import { expect } from "vitest"; + +interface CustomMatchers { + toContainHeaders(expectedHeaders: Record): R; +} + +declare module "vitest" { + interface Assertion extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} +} + +expect.extend({ + toContainHeaders(actual: unknown, expectedHeaders: Record) { + const isHeaders = actual instanceof Headers; + const isPlainObject = typeof actual === "object" && actual !== null && !Array.isArray(actual); + + if (!isHeaders && !isPlainObject) { + throw new TypeError("Received value must be an instance of Headers or a plain object!"); + } + + if (typeof expectedHeaders !== "object" || expectedHeaders === null || Array.isArray(expectedHeaders)) { + throw new TypeError("Expected headers must be a plain object!"); + } + + const missingHeaders: string[] = []; + const mismatchedHeaders: Array<{ key: string; expected: string; actual: string | null }> = []; + + for (const [key, value] of Object.entries(expectedHeaders)) { + let actualValue: string | null = null; + + if (isHeaders) { + // Headers.get() is already case-insensitive + actualValue = (actual as Headers).get(key); + } else { + // For plain objects, do case-insensitive lookup + const actualObj = actual as Record; + const lowerKey = key.toLowerCase(); + const foundKey = Object.keys(actualObj).find((k) => k.toLowerCase() === lowerKey); + actualValue = foundKey ? actualObj[foundKey] : null; + } + + if (actualValue === null || actualValue === undefined) { + missingHeaders.push(key); + } else if (actualValue !== value) { + mismatchedHeaders.push({ key, expected: value, actual: actualValue }); + } + } + + const pass = missingHeaders.length === 0 && mismatchedHeaders.length === 0; + + const actualType = isHeaders ? "Headers" : "object"; + + if (pass) { + return { + message: () => `expected ${actualType} not to contain ${this.utils.printExpected(expectedHeaders)}`, + pass: true, + }; + } else { + const messages: string[] = []; + + if (missingHeaders.length > 0) { + messages.push(`Missing headers: ${this.utils.printExpected(missingHeaders.join(", "))}`); + } + + if (mismatchedHeaders.length > 0) { + const mismatches = mismatchedHeaders.map( + ({ key, expected, actual }) => + `${key}: expected ${this.utils.printExpected(expected)} but got ${this.utils.printReceived(actual)}`, + ); + messages.push(mismatches.join("\n")); + } + + return { + message: () => + `expected ${actualType} to contain ${this.utils.printExpected(expectedHeaders)}\n\n${messages.join("\n")}`, + pass: false, + }; + } + }, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json new file mode 100644 index 000000000000..a477df47920c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": null, + "rootDir": "..", + "baseUrl": "..", + "types": ["vitest/globals"] + }, + "include": ["../src", "../tests"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts new file mode 100644 index 000000000000..9b5123364c47 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BasicAuth.test.ts @@ -0,0 +1,92 @@ +import { BasicAuth } from "../../../src/core/auth/BasicAuth"; + +describe("BasicAuth", () => { + interface ToHeaderTestCase { + description: string; + input: { username: string; password: string }; + expected: string; + } + + interface FromHeaderTestCase { + description: string; + input: string; + expected: { username: string; password: string }; + } + + interface ErrorTestCase { + description: string; + input: string; + expectedError: string; + } + + describe("toAuthorizationHeader", () => { + const toHeaderTests: ToHeaderTestCase[] = [ + { + description: "correctly converts to header", + input: { username: "username", password: "password" }, + expected: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + }, + ]; + + toHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.toAuthorizationHeader(input)).toBe(expected); + }); + }); + }); + + describe("fromAuthorizationHeader", () => { + const fromHeaderTests: FromHeaderTestCase[] = [ + { + description: "correctly parses header", + input: "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", + expected: { username: "username", password: "password" }, + }, + { + description: "handles password with colons", + input: "Basic dXNlcjpwYXNzOndvcmQ=", + expected: { username: "user", password: "pass:word" }, + }, + { + description: "handles empty username and password (just colon)", + input: "Basic Og==", + expected: { username: "", password: "" }, + }, + { + description: "handles empty username", + input: "Basic OnBhc3N3b3Jk", + expected: { username: "", password: "password" }, + }, + { + description: "handles empty password", + input: "Basic dXNlcm5hbWU6", + expected: { username: "username", password: "" }, + }, + ]; + + fromHeaderTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(BasicAuth.fromAuthorizationHeader(input)).toEqual(expected); + }); + }); + + const errorTests: ErrorTestCase[] = [ + { + description: "throws error for completely empty credentials", + input: "Basic ", + expectedError: "Invalid basic auth", + }, + { + description: "throws error for credentials without colon", + input: "Basic dXNlcm5hbWU=", + expectedError: "Invalid basic auth", + }, + ]; + + errorTests.forEach(({ description, input, expectedError }) => { + it(description, () => { + expect(() => BasicAuth.fromAuthorizationHeader(input)).toThrow(expectedError); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts new file mode 100644 index 000000000000..7757b87cb97e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/auth/BearerToken.test.ts @@ -0,0 +1,14 @@ +import { BearerToken } from "../../../src/core/auth/BearerToken"; + +describe("BearerToken", () => { + describe("toAuthorizationHeader", () => { + it("correctly converts to header", () => { + expect(BearerToken.toAuthorizationHeader("my-token")).toBe("Bearer my-token"); + }); + }); + describe("fromAuthorizationHeader", () => { + it("correctly parses header", () => { + expect(BearerToken.fromAuthorizationHeader("Bearer my-token")).toBe("my-token"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts new file mode 100644 index 000000000000..939594ca277b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/base64.test.ts @@ -0,0 +1,53 @@ +import { base64Decode, base64Encode } from "../../src/core/base64"; + +describe("base64", () => { + describe("base64Encode", () => { + it("should encode ASCII strings", () => { + expect(base64Encode("hello")).toBe("aGVsbG8="); + expect(base64Encode("")).toBe(""); + }); + + it("should encode UTF-8 strings", () => { + expect(base64Encode("café")).toBe("Y2Fmw6k="); + expect(base64Encode("🎉")).toBe("8J+OiQ=="); + }); + + it("should handle basic auth credentials", () => { + expect(base64Encode("username:password")).toBe("dXNlcm5hbWU6cGFzc3dvcmQ="); + }); + }); + + describe("base64Decode", () => { + it("should decode ASCII strings", () => { + expect(base64Decode("aGVsbG8=")).toBe("hello"); + expect(base64Decode("")).toBe(""); + }); + + it("should decode UTF-8 strings", () => { + expect(base64Decode("Y2Fmw6k=")).toBe("café"); + expect(base64Decode("8J+OiQ==")).toBe("🎉"); + }); + + it("should handle basic auth credentials", () => { + expect(base64Decode("dXNlcm5hbWU6cGFzc3dvcmQ=")).toBe("username:password"); + }); + }); + + describe("round-trip encoding", () => { + const testStrings = [ + "hello world", + "test@example.com", + "café", + "username:password", + "user@domain.com:super$ecret123!", + ]; + + testStrings.forEach((testString) => { + it(`should round-trip encode/decode: "${testString}"`, () => { + const encoded = base64Encode(testString); + const decoded = base64Decode(encoded); + expect(decoded).toBe(testString); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts new file mode 100644 index 000000000000..60df2b5e4824 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/Fetcher.test.ts @@ -0,0 +1,261 @@ +import fs from "fs"; +import { join } from "path"; +import stream from "stream"; +import type { BinaryResponse } from "../../../src/core"; +import { type Fetcher, fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +describe("Test fetcherImpl", () => { + it("should handle successful request", async () => { + const mockArgs: Fetcher.Args = { + url: "https://httpbin.org/post", + method: "POST", + headers: { "X-Test": "x-test-header" }, + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + maxRetries: 0, + responseType: "json", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + + expect(global.fetch).toHaveBeenCalledWith( + "https://httpbin.org/post", + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: JSON.stringify({ data: "test" }), + }), + ); + }); + + it("should send octet stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "POST", + headers: { "X-Test": "x-test-header" }, + contentType: "application/octet-stream", + requestType: "bytes", + maxRetries: 0, + responseType: "json", + body: fs.createReadStream(join(__dirname, "test-file.txt")), + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + }), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "POST", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + body: expect.any(fs.ReadStream), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.body).toEqual({ data: "test" }); + } + }); + + it("should receive file as stream", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.stream).toBe("function"); + const stream = body.stream(); + expect(stream).toBeInstanceOf(ReadableStream); + const reader = stream.getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as blob", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.blob).toBe("function"); + const blob = await body.blob(); + expect(blob).toBeInstanceOf(Blob); + const reader = blob.stream().getReader(); + const { value } = await reader.read(); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as arraybuffer", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.arrayBuffer).toBe("function"); + const arrayBuffer = await body.arrayBuffer(); + expect(arrayBuffer).toBeInstanceOf(ArrayBuffer); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(new Uint8Array(arrayBuffer)); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); + + it("should receive file as bytes", async () => { + const url = "https://httpbin.org/post/file"; + const mockArgs: Fetcher.Args = { + url, + method: "GET", + headers: { "X-Test": "x-test-header" }, + maxRetries: 0, + responseType: "binary-response", + }; + + global.fetch = vi.fn().mockResolvedValue( + new Response( + stream.Readable.toWeb(fs.createReadStream(join(__dirname, "test-file.txt"))) as ReadableStream, + { + status: 200, + statusText: "OK", + }, + ), + ); + + const result = await fetcherImpl(mockArgs); + + expect(global.fetch).toHaveBeenCalledWith( + url, + expect.objectContaining({ + method: "GET", + headers: expect.toContainHeaders({ "X-Test": "x-test-header" }), + }), + ); + expect(result.ok).toBe(true); + if (result.ok) { + const body = result.body as BinaryResponse; + expect(body).toBeDefined(); + expect(body.bodyUsed).toBe(false); + expect(typeof body.bytes).toBe("function"); + if (!body.bytes) { + return; + } + const bytes = await body.bytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + const decoder = new TextDecoder(); + const streamContent = decoder.decode(bytes); + expect(streamContent).toBe("This is a test file!\n"); + expect(body.bodyUsed).toBe(true); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts new file mode 100644 index 000000000000..2ec008e581d8 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/HttpResponsePromise.test.ts @@ -0,0 +1,143 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; + +import { HttpResponsePromise } from "../../../src/core/fetcher/HttpResponsePromise"; +import type { RawResponse, WithRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("HttpResponsePromise", () => { + const mockRawResponse: RawResponse = { + headers: new Headers(), + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + const mockData = { id: "123", name: "test" }; + const mockWithRawResponse: WithRawResponse = { + data: mockData, + rawResponse: mockRawResponse, + }; + + describe("fromFunction", () => { + it("should create an HttpResponsePromise from a function", async () => { + const mockFn = vi + .fn<(arg1: string, arg2: string) => Promise>>() + .mockResolvedValue(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromFunction(mockFn, "arg1", "arg2"); + + const result = await responsePromise; + expect(result).toEqual(mockData); + expect(mockFn).toHaveBeenCalledWith("arg1", "arg2"); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromPromise", () => { + it("should create an HttpResponsePromise from a promise", async () => { + const promise = Promise.resolve(mockWithRawResponse); + + const responsePromise = HttpResponsePromise.fromPromise(promise); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromExecutor", () => { + it("should create an HttpResponsePromise from an executor function", async () => { + const responsePromise = HttpResponsePromise.fromExecutor((resolve) => { + resolve(mockWithRawResponse); + }); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("fromResult", () => { + it("should create an HttpResponsePromise from a result", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise; + expect(result).toEqual(mockData); + + const resultWithRawResponse = await responsePromise.withRawResponse(); + expect(resultWithRawResponse).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); + + describe("Promise methods", () => { + let responsePromise: HttpResponsePromise; + + beforeEach(() => { + responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + }); + + it("should support then() method", async () => { + const result = await responsePromise.then((data) => ({ + ...data, + modified: true, + })); + + expect(result).toEqual({ + ...mockData, + modified: true, + }); + }); + + it("should support catch() method", async () => { + const errorResponsePromise = HttpResponsePromise.fromExecutor((_, reject) => { + reject(new Error("Test error")); + }); + + const catchSpy = vi.fn(); + await errorResponsePromise.catch(catchSpy); + + expect(catchSpy).toHaveBeenCalled(); + const error = catchSpy.mock.calls[0]?.[0]; + expect(error).toBeInstanceOf(Error); + expect((error as Error).message).toBe("Test error"); + }); + + it("should support finally() method", async () => { + const finallySpy = vi.fn(); + await responsePromise.finally(finallySpy); + + expect(finallySpy).toHaveBeenCalled(); + }); + }); + + describe("withRawResponse", () => { + it("should return both data and raw response", async () => { + const responsePromise = HttpResponsePromise.fromResult(mockWithRawResponse); + + const result = await responsePromise.withRawResponse(); + + expect(result).toEqual({ + data: mockData, + rawResponse: mockRawResponse, + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts new file mode 100644 index 000000000000..375ee3f38064 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/RawResponse.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from "vitest"; + +import { toRawResponse } from "../../../src/core/fetcher/RawResponse"; + +describe("RawResponse", () => { + describe("toRawResponse", () => { + it("should convert Response to RawResponse by removing body, bodyUsed, and ok properties", () => { + const mockHeaders = new Headers({ "content-type": "application/json" }); + const mockResponse = { + body: "test body", + bodyUsed: false, + ok: true, + headers: mockHeaders, + redirected: false, + status: 200, + statusText: "OK", + type: "basic" as ResponseType, + url: "https://example.com", + }; + + const result = toRawResponse(mockResponse as unknown as Response); + + expect("body" in result).toBe(false); + expect("bodyUsed" in result).toBe(false); + expect("ok" in result).toBe(false); + expect(result.headers).toBe(mockHeaders); + expect(result.redirected).toBe(false); + expect(result.status).toBe(200); + expect(result.statusText).toBe("OK"); + expect(result.type).toBe("basic"); + expect(result.url).toBe("https://example.com"); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts new file mode 100644 index 000000000000..a92f1b5e81d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/createRequestUrl.test.ts @@ -0,0 +1,163 @@ +import { createRequestUrl } from "../../../src/core/fetcher/createRequestUrl"; + +describe("Test createRequestUrl", () => { + const BASE_URL = "https://api.example.com"; + + interface TestCase { + description: string; + baseUrl: string; + queryParams?: Record; + expected: string; + } + + const testCases: TestCase[] = [ + { + description: "should return the base URL when no query parameters are provided", + baseUrl: BASE_URL, + expected: BASE_URL, + }, + { + description: "should append simple query parameters", + baseUrl: BASE_URL, + queryParams: { key: "value", another: "param" }, + expected: "https://api.example.com?key=value&another=param", + }, + { + description: "should handle array query parameters", + baseUrl: BASE_URL, + queryParams: { items: ["a", "b", "c"] }, + expected: "https://api.example.com?items=a&items=b&items=c", + }, + { + description: "should handle object query parameters", + baseUrl: BASE_URL, + queryParams: { filter: { name: "John", age: 30 } }, + expected: "https://api.example.com?filter%5Bname%5D=John&filter%5Bage%5D=30", + }, + { + description: "should handle mixed types of query parameters", + baseUrl: BASE_URL, + queryParams: { + simple: "value", + array: ["x", "y"], + object: { key: "value" }, + }, + expected: "https://api.example.com?simple=value&array=x&array=y&object%5Bkey%5D=value", + }, + { + description: "should handle empty query parameters object", + baseUrl: BASE_URL, + queryParams: {}, + expected: BASE_URL, + }, + { + description: "should encode special characters in query parameters", + baseUrl: BASE_URL, + queryParams: { special: "a&b=c d" }, + expected: "https://api.example.com?special=a%26b%3Dc%20d", + }, + { + description: "should handle numeric values", + baseUrl: BASE_URL, + queryParams: { count: 42, price: 19.99, active: 1, inactive: 0 }, + expected: "https://api.example.com?count=42&price=19.99&active=1&inactive=0", + }, + { + description: "should handle boolean values", + baseUrl: BASE_URL, + queryParams: { enabled: true, disabled: false }, + expected: "https://api.example.com?enabled=true&disabled=false", + }, + { + description: "should handle null and undefined values", + baseUrl: BASE_URL, + queryParams: { + valid: "value", + nullValue: null, + undefinedValue: undefined, + emptyString: "", + }, + expected: "https://api.example.com?valid=value&nullValue=&emptyString=", + }, + { + description: "should handle deeply nested objects", + baseUrl: BASE_URL, + queryParams: { + user: { + profile: { + name: "John", + settings: { theme: "dark" }, + }, + }, + }, + expected: + "https://api.example.com?user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle arrays of objects", + baseUrl: BASE_URL, + queryParams: { + users: [ + { name: "John", age: 30 }, + { name: "Jane", age: 25 }, + ], + }, + expected: + "https://api.example.com?users%5Bname%5D=John&users%5Bage%5D=30&users%5Bname%5D=Jane&users%5Bage%5D=25", + }, + { + description: "should handle mixed arrays", + baseUrl: BASE_URL, + queryParams: { + mixed: ["string", 42, true, { key: "value" }], + }, + expected: "https://api.example.com?mixed=string&mixed=42&mixed=true&mixed%5Bkey%5D=value", + }, + { + description: "should handle empty arrays", + baseUrl: BASE_URL, + queryParams: { emptyArray: [] }, + expected: BASE_URL, + }, + { + description: "should handle empty objects", + baseUrl: BASE_URL, + queryParams: { emptyObject: {} }, + expected: BASE_URL, + }, + { + description: "should handle special characters in keys", + baseUrl: BASE_URL, + queryParams: { "key with spaces": "value", "key[with]brackets": "value" }, + expected: "https://api.example.com?key%20with%20spaces=value&key%5Bwith%5Dbrackets=value", + }, + { + description: "should handle URL with existing query parameters", + baseUrl: "https://api.example.com?existing=param", + queryParams: { new: "value" }, + expected: "https://api.example.com?existing=param?new=value", + }, + { + description: "should handle complex nested structures", + baseUrl: BASE_URL, + queryParams: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "https://api.example.com?filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + ]; + + testCases.forEach(({ description, baseUrl, queryParams, expected }) => { + it(description, () => { + expect(createRequestUrl(baseUrl, queryParams)).toBe(expected); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts new file mode 100644 index 000000000000..8a6c3a57e211 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getRequestBody.test.ts @@ -0,0 +1,129 @@ +import { getRequestBody } from "../../../src/core/fetcher/getRequestBody"; +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getRequestBody", () => { + interface TestCase { + description: string; + input: any; + type: "json" | "form" | "file" | "bytes" | "other"; + expected: any; + skipCondition?: () => boolean; + } + + const testCases: TestCase[] = [ + { + description: "should stringify body if not FormData in Node environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "node", + }, + { + description: "should stringify body if not FormData in browser environment", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + skipCondition: () => RUNTIME.type !== "browser", + }, + { + description: "should return the Uint8Array", + input: new Uint8Array([1, 2, 3]), + type: "bytes", + expected: new Uint8Array([1, 2, 3]), + }, + { + description: "should serialize objects for form-urlencoded content type", + input: { username: "johndoe", email: "john@example.com" }, + type: "form", + expected: "username=johndoe&email=john%40example.com", + }, + { + description: "should serialize complex nested objects and arrays for form-urlencoded content type", + input: { + user: { + profile: { + name: "John Doe", + settings: { + theme: "dark", + notifications: true, + }, + }, + tags: ["admin", "user"], + contacts: [ + { type: "email", value: "john@example.com" }, + { type: "phone", value: "+1234567890" }, + ], + }, + filters: { + status: ["active", "pending"], + metadata: { + created: "2024-01-01", + categories: ["electronics", "books"], + }, + }, + preferences: ["notifications", "updates"], + }, + type: "form", + expected: + "user%5Bprofile%5D%5Bname%5D=John%20Doe&" + + "user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark&" + + "user%5Bprofile%5D%5Bsettings%5D%5Bnotifications%5D=true&" + + "user%5Btags%5D=admin&" + + "user%5Btags%5D=user&" + + "user%5Bcontacts%5D%5Btype%5D=email&" + + "user%5Bcontacts%5D%5Bvalue%5D=john%40example.com&" + + "user%5Bcontacts%5D%5Btype%5D=phone&" + + "user%5Bcontacts%5D%5Bvalue%5D=%2B1234567890&" + + "filters%5Bstatus%5D=active&" + + "filters%5Bstatus%5D=pending&" + + "filters%5Bmetadata%5D%5Bcreated%5D=2024-01-01&" + + "filters%5Bmetadata%5D%5Bcategories%5D=electronics&" + + "filters%5Bmetadata%5D%5Bcategories%5D=books&" + + "preferences=notifications&" + + "preferences=updates", + }, + { + description: "should return the input for pre-serialized form-urlencoded strings", + input: "key=value&another=param", + type: "other", + expected: "key=value&another=param", + }, + { + description: "should JSON stringify objects", + input: { key: "value" }, + type: "json", + expected: '{"key":"value"}', + }, + ]; + + testCases.forEach(({ description, input, type, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const result = await getRequestBody({ + body: input, + type, + }); + + if (input instanceof Uint8Array) { + expect(result).toBe(input); + } else { + expect(result).toBe(expected); + } + }); + }); + + it("should return FormData in browser environment", async () => { + if (RUNTIME.type === "browser") { + const formData = new FormData(); + formData.append("key", "value"); + const result = await getRequestBody({ + body: formData, + type: "file", + }); + expect(result).toBe(formData); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts new file mode 100644 index 000000000000..ad6be7fc2c9b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/getResponseBody.test.ts @@ -0,0 +1,97 @@ +import { getResponseBody } from "../../../src/core/fetcher/getResponseBody"; + +import { RUNTIME } from "../../../src/core/runtime"; + +describe("Test getResponseBody", () => { + interface SimpleTestCase { + description: string; + responseData: string | Record; + responseType?: "blob" | "sse" | "streaming" | "text"; + expected: any; + skipCondition?: () => boolean; + } + + const simpleTestCases: SimpleTestCase[] = [ + { + description: "should handle text response type", + responseData: "test text", + responseType: "text", + expected: "test text", + }, + { + description: "should handle JSON response", + responseData: { key: "value" }, + expected: { key: "value" }, + }, + { + description: "should handle empty response", + responseData: "", + expected: undefined, + }, + { + description: "should handle non-JSON response", + responseData: "invalid json", + expected: { + ok: false, + error: { + reason: "non-json", + statusCode: 200, + rawBody: "invalid json", + }, + }, + }, + ]; + + simpleTestCases.forEach(({ description, responseData, responseType, expected, skipCondition }) => { + it(description, async () => { + if (skipCondition?.()) { + return; + } + + const mockResponse = new Response( + typeof responseData === "string" ? responseData : JSON.stringify(responseData), + ); + const result = await getResponseBody(mockResponse, responseType); + expect(result).toEqual(expected); + }); + }); + + it("should handle blob response type", async () => { + const mockBlob = new Blob(["test"], { type: "text/plain" }); + const mockResponse = new Response(mockBlob); + const result = await getResponseBody(mockResponse, "blob"); + // @ts-expect-error + expect(result.constructor.name).toBe("Blob"); + }); + + it("should handle sse response type", async () => { + if (RUNTIME.type === "node") { + const mockStream = new ReadableStream(); + const mockResponse = new Response(mockStream); + const result = await getResponseBody(mockResponse, "sse"); + expect(result).toBe(mockStream); + } + }); + + it("should handle streaming response type", async () => { + const encoder = new TextEncoder(); + const testData = "test stream data"; + const mockStream = new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(testData)); + controller.close(); + }, + }); + + const mockResponse = new Response(mockStream); + const result = (await getResponseBody(mockResponse, "streaming")) as ReadableStream; + + expect(result).toBeInstanceOf(ReadableStream); + + const reader = result.getReader(); + const decoder = new TextDecoder(); + const { value } = await reader.read(); + const streamContent = decoder.decode(value); + expect(streamContent).toBe(testData); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts new file mode 100644 index 000000000000..366c9b6ced61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/logging.test.ts @@ -0,0 +1,517 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +function mockErrorResponse(data: unknown = { error: "Error" }, status = 404, statusText = "Not Found") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Fetcher Logging Integration", () => { + describe("Request Logging", () => { + it("should log successful request at debug level", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + headers: { "Content-Type": "application/json" }, + body: { test: "data" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + }), + hasBody: true, + }), + ); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + method: "POST", + url: "https://example.com/api", + statusCode: 200, + }), + ); + }); + + it("should not log debug messages at info level for successful requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "info", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + }); + + it("should log request with body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: true, + }), + ); + }); + + it("should log request without body flag", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + hasBody: false, + }), + ); + }); + + it("should not log when silent mode is enabled", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: true, + }, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should not log when no logging config is provided", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + }); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Error Logging", () => { + it("should log 4xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Not found" }, 404, "Not Found"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 404, + }), + ); + }); + + it("should log 5xx errors at error level", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Internal error" }, 500, "Internal Server Error"); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + statusCode: 500, + }), + ); + }); + + it("should log aborted request errors", async () => { + const mockLogger = createMockLogger(); + + const abortController = new AbortController(); + abortController.abort(); + + global.fetch = vi.fn().mockRejectedValue(new Error("Aborted")); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + abortSignal: abortController.signal, + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request was aborted", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + }), + ); + }); + + it("should log timeout errors", async () => { + const mockLogger = createMockLogger(); + + const timeoutError = new Error("Request timeout"); + timeoutError.name = "AbortError"; + + global.fetch = vi.fn().mockRejectedValue(timeoutError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request timed out", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + timeoutMs: undefined, + }), + ); + }); + + it("should log unknown errors", async () => { + const mockLogger = createMockLogger(); + + const unknownError = new Error("Unknown error"); + + global.fetch = vi.fn().mockRejectedValue(unknownError); + + const result = await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(result.ok).toBe(false); + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error", + expect.objectContaining({ + method: "GET", + url: "https://example.com/api", + errorMessage: "Unknown error", + }), + ); + }); + }); + + describe("Logging with Redaction", () => { + it("should redact sensitive data in error logs", async () => { + const mockLogger = createMockLogger(); + mockErrorResponse({ error: "Unauthorized" }, 401, "Unauthorized"); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]", + }), + ); + }); + }); + + describe("Different HTTP Methods", () => { + it("should log GET requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "GET", + }), + ); + }); + + it("should log POST requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "POST", + }), + ); + }); + + it("should log PUT requests", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "PUT", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "PUT", + }), + ); + }); + + it("should log DELETE requests", async () => { + const mockLogger = createMockLogger(); + global.fetch = vi.fn().mockResolvedValue( + new Response(null, { + status: 200, + statusText: "OK", + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "DELETE", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + method: "DELETE", + }), + ); + }); + }); + + describe("Status Code Logging", () => { + it("should log 2xx success status codes", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 201, "Created"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "POST", + body: { data: "test" }, + contentType: "application/json", + requestType: "json", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 201, + }), + ); + }); + + it("should log 3xx redirect status codes as success", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse({ data: "test" }, 301, "Moved Permanently"); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + statusCode: 301, + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts new file mode 100644 index 000000000000..ea49466a55fc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/makeRequest.test.ts @@ -0,0 +1,54 @@ +import type { Mock } from "vitest"; +import { makeRequest } from "../../../src/core/fetcher/makeRequest"; + +describe("Test makeRequest", () => { + const mockPostUrl = "https://httpbin.org/post"; + const mockGetUrl = "https://httpbin.org/get"; + const mockHeaders = { "Content-Type": "application/json" }; + const mockBody = JSON.stringify({ key: "value" }); + + let mockFetch: Mock; + + beforeEach(() => { + mockFetch = vi.fn(); + mockFetch.mockResolvedValue(new Response(JSON.stringify({ test: "successful" }), { status: 200 })); + }); + + it("should handle POST request correctly", async () => { + const response = await makeRequest(mockFetch, mockPostUrl, "POST", mockHeaders, mockBody); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockPostUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "POST", + headers: mockHeaders, + body: mockBody, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); + + it("should handle GET request correctly", async () => { + const response = await makeRequest(mockFetch, mockGetUrl, "GET", mockHeaders, undefined); + const responseBody = await response.json(); + expect(responseBody).toEqual({ test: "successful" }); + expect(mockFetch).toHaveBeenCalledTimes(1); + const [calledUrl, calledOptions] = mockFetch.mock.calls[0]; + expect(calledUrl).toBe(mockGetUrl); + expect(calledOptions).toEqual( + expect.objectContaining({ + method: "GET", + headers: mockHeaders, + body: undefined, + credentials: undefined, + }), + ); + expect(calledOptions.signal).toBeDefined(); + expect(calledOptions.signal).toBeInstanceOf(AbortSignal); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts new file mode 100644 index 000000000000..d599376b9bcf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/redacting.test.ts @@ -0,0 +1,1115 @@ +import { fetcherImpl } from "../../../src/core/fetcher/Fetcher"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +function mockSuccessResponse(data: unknown = { data: "test" }, status = 200, statusText = "OK") { + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify(data), { + status, + statusText, + }), + ); +} + +describe("Redacting Logic", () => { + describe("Header Redaction", () => { + it("should redact authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Authorization: "Bearer secret-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + }), + }), + ); + }); + + it("should redact api-key header (case-insensitive)", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-API-KEY": "secret-api-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-API-KEY": "[REDACTED]", + }), + }), + ); + }); + + it("should redact cookie header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { Cookie: "session=abc123; token=xyz789" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Cookie: "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-auth-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "x-auth-token": "auth-token-12345" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "x-auth-token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact proxy-authorization header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "Proxy-Authorization": "Basic credentials" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Proxy-Authorization": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-csrf-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-CSRF-Token": "csrf-token-abc" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-CSRF-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should redact www-authenticate header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "WWW-Authenticate": "Bearer realm=example" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "WWW-Authenticate": "[REDACTED]", + }), + }), + ); + }); + + it("should redact x-session-token header", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { "X-Session-Token": "session-token-xyz" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "X-Session-Token": "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive headers", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + "Content-Type": "application/json", + "User-Agent": "Test/1.0", + Accept: "application/json", + }), + }), + ); + }); + + it("should redact multiple sensitive headers at once", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + headers: { + Authorization: "Bearer token", + "X-API-Key": "api-key", + Cookie: "session=123", + "Content-Type": "application/json", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + headers: expect.toContainHeaders({ + Authorization: "[REDACTED]", + "X-API-Key": "[REDACTED]", + Cookie: "[REDACTED]", + "Content-Type": "application/json", + }), + }), + ); + }); + }); + + describe("Response Header Redaction", () => { + it("should redact Set-Cookie in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Set-Cookie", "session=abc123; HttpOnly; Secure"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "set-cookie": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact authorization in response headers", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("Authorization", "Bearer token-123"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ data: "test" }), { + status: 200, + statusText: "OK", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "HTTP request succeeded", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + authorization: "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + + it("should redact response headers in error responses", async () => { + const mockLogger = createMockLogger(); + + const mockHeaders = new Headers(); + mockHeaders.set("WWW-Authenticate", "Bearer realm=example"); + mockHeaders.set("Content-Type", "application/json"); + + global.fetch = vi.fn().mockResolvedValue( + new Response(JSON.stringify({ error: "Unauthorized" }), { + status: 401, + statusText: "Unauthorized", + headers: mockHeaders, + }), + ); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "error", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.error).toHaveBeenCalledWith( + "HTTP request failed with error status", + expect.objectContaining({ + responseHeaders: expect.toContainHeaders({ + "www-authenticate": "[REDACTED]", + "content-type": "application/json", + }), + }), + ); + }); + }); + + describe("Query Parameter Redaction", () => { + it("should redact api_key query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { api_key: "secret-key" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + api_key: "[REDACTED]", + }), + }), + ); + }); + + it("should redact token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact access_token query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { access_token: "secret-access-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + access_token: "[REDACTED]", + }), + }), + ); + }); + + it("should redact password query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { password: "secret-password" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + password: "[REDACTED]", + }), + }), + ); + }); + + it("should redact secret query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { secret: "secret-value" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + secret: "[REDACTED]", + }), + }), + ); + }); + + it("should redact session_id query parameter", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { session_id: "session-123" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + session_id: "[REDACTED]", + }), + }), + ); + }); + + it("should not redact non-sensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + page: "1", + limit: "10", + sort: "name", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + page: "1", + limit: "10", + sort: "name", + }), + }), + ); + }); + + it("should not redact parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { + author: "john", + authenticate: "false", + authorization_level: "user", + }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + author: "john", + authenticate: "false", + authorization_level: "user", + }), + }), + ); + }); + + it("should handle undefined query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: undefined, + }), + ); + }); + + it("should redact case-insensitive query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + queryParameters: { API_KEY: "secret-key", Token: "secret-token" }, + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + queryParameters: expect.objectContaining({ + API_KEY: "[REDACTED]", + Token: "[REDACTED]", + }), + }), + ); + }); + }); + + describe("URL Redaction", () => { + it("should redact credentials in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:password@example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api", + }), + ); + }); + + it("should redact api_key in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret-key&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&page=1", + }), + ); + }); + + it("should redact token in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret-token", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should redact password in query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?username=user&password=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?username=user&password=[REDACTED]", + }), + ); + }); + + it("should not redact non-sensitive query strings", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name", + }), + ); + }); + + it("should not redact URL parameters containing 'auth' substring like 'author'", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?author=john&authenticate=false&page=1", + }), + ); + }); + + it("should handle URL with fragment", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?token=secret#section", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?token=[REDACTED]#section", + }), + ); + }); + + it("should redact URL-encoded query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api%5Fkey=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api%5Fkey=[REDACTED]", + }), + ); + }); + + it("should handle URL without query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api", + }), + ); + }); + + it("should handle empty query string", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?", + }), + ); + }); + + it("should redact multiple sensitive parameters in URL", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?api_key=secret1&token=secret2&page=1", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?api_key=[REDACTED]&token=[REDACTED]&page=1", + }), + ); + }); + + it("should redact both credentials and query parameters", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/api?token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/api?token=[REDACTED]", + }), + ); + }); + + it("should use fast path for URLs without sensitive keywords", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?page=1&limit=10&sort=name&filter=value", + }), + ); + }); + + it("should handle query parameter without value", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?flag&token=secret", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?flag&token=[REDACTED]", + }), + ); + }); + + it("should handle URL with multiple @ symbols in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user@example.com:pass@host.com/api", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@host.com/api", + }), + ); + }); + + it("should handle URL with @ in query parameter but not in credentials", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://example.com/api?email=user@example.com", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://example.com/api?email=user@example.com", + }), + ); + }); + + it("should handle URL with both credentials and @ in path", async () => { + const mockLogger = createMockLogger(); + mockSuccessResponse(); + + await fetcherImpl({ + url: "https://user:pass@example.com/users/@username", + method: "GET", + responseType: "json", + maxRetries: 0, + logging: { + level: "debug", + logger: mockLogger, + silent: false, + }, + }); + + expect(mockLogger.debug).toHaveBeenCalledWith( + "Making HTTP request", + expect.objectContaining({ + url: "https://[REDACTED]@example.com/users/@username", + }), + ); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts new file mode 100644 index 000000000000..d22661367f4e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/requestWithRetries.test.ts @@ -0,0 +1,230 @@ +import type { Mock, MockInstance } from "vitest"; +import { requestWithRetries } from "../../../src/core/fetcher/requestWithRetries"; + +describe("requestWithRetries", () => { + let mockFetch: Mock; + let originalMathRandom: typeof Math.random; + let setTimeoutSpy: MockInstance; + + beforeEach(() => { + mockFetch = vi.fn(); + originalMathRandom = Math.random; + + Math.random = vi.fn(() => 0.5); + + vi.useFakeTimers({ + toFake: [ + "setTimeout", + "clearTimeout", + "setInterval", + "clearInterval", + "setImmediate", + "clearImmediate", + "Date", + "performance", + "requestAnimationFrame", + "cancelAnimationFrame", + "requestIdleCallback", + "cancelIdleCallback", + ], + }); + }); + + afterEach(() => { + Math.random = originalMathRandom; + vi.clearAllMocks(); + vi.clearAllTimers(); + }); + + it("should retry on retryable status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const retryableStatuses = [408, 429, 500, 502]; + let callCount = 0; + + mockFetch.mockImplementation(async () => { + if (callCount < retryableStatuses.length) { + return new Response("", { status: retryableStatuses[callCount++] }); + } + return new Response("", { status: 200 }); + }); + + const responsePromise = requestWithRetries(() => mockFetch(), retryableStatuses.length); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(retryableStatuses.length + 1); + expect(response.status).toBe(200); + }); + + it("should respect maxRetries limit", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const maxRetries = 2; + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + expect(response.status).toBe(500); + }); + + it("should not retry on success status codes", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const successStatuses = [200, 201, 202]; + + for (const status of successStatuses) { + mockFetch.mockReset(); + setTimeoutSpy.mockClear(); + mockFetch.mockResolvedValueOnce(new Response("", { status })); + + const responsePromise = requestWithRetries(() => mockFetch(), 3); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(mockFetch).toHaveBeenCalledTimes(1); + expect(setTimeoutSpy).not.toHaveBeenCalled(); + } + }); + + interface RetryHeaderTestCase { + description: string; + headerName: string; + headerValue: string | (() => string); + expectedDelayMin: number; + expectedDelayMax: number; + } + + const retryHeaderTests: RetryHeaderTestCase[] = [ + { + description: "should respect retry-after header with seconds value", + headerName: "retry-after", + headerValue: "5", + expectedDelayMin: 4000, + expectedDelayMax: 6000, + }, + { + description: "should respect retry-after header with HTTP date value", + headerName: "retry-after", + headerValue: () => new Date(Date.now() + 3000).toUTCString(), + expectedDelayMin: 2000, + expectedDelayMax: 4000, + }, + { + description: "should respect x-ratelimit-reset header", + headerName: "x-ratelimit-reset", + headerValue: () => Math.floor((Date.now() + 4000) / 1000).toString(), + expectedDelayMin: 3000, + expectedDelayMax: 6000, + }, + ]; + + retryHeaderTests.forEach(({ description, headerName, headerValue, expectedDelayMin, expectedDelayMax }) => { + it(description, async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + const value = typeof headerValue === "function" ? headerValue() : headerValue; + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ [headerName]: value }), + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), expect.any(Number)); + const actualDelay = setTimeoutSpy.mock.calls[0][1]; + expect(actualDelay).toBeGreaterThan(expectedDelayMin); + expect(actualDelay).toBeLessThan(expectedDelayMax); + expect(response.status).toBe(200); + }); + }); + + it("should apply correct exponential backoff with jitter", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch.mockResolvedValue(new Response("", { status: 500 })); + const maxRetries = 3; + const expectedDelays = [1000, 2000, 4000]; + + const responsePromise = requestWithRetries(() => mockFetch(), maxRetries); + await vi.runAllTimersAsync(); + await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledTimes(expectedDelays.length); + + expectedDelays.forEach((delay, index) => { + expect(setTimeoutSpy).toHaveBeenNthCalledWith(index + 1, expect.any(Function), delay); + }); + + expect(mockFetch).toHaveBeenCalledTimes(maxRetries + 1); + }); + + it("should handle concurrent retries independently", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 500 })) + .mockResolvedValueOnce(new Response("", { status: 200 })) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const promise1 = requestWithRetries(() => mockFetch(), 1); + const promise2 = requestWithRetries(() => mockFetch(), 1); + + await vi.runAllTimersAsync(); + const [response1, response2] = await Promise.all([promise1, promise2]); + + expect(response1.status).toBe(200); + expect(response2.status).toBe(200); + }); + + it("should cap delay at MAX_RETRY_DELAY for large header values", async () => { + setTimeoutSpy = vi.spyOn(global, "setTimeout").mockImplementation((callback: (args: void) => void) => { + process.nextTick(callback); + return null as any; + }); + + mockFetch + .mockResolvedValueOnce( + new Response("", { + status: 429, + headers: new Headers({ "retry-after": "120" }), // 120 seconds = 120000ms > MAX_RETRY_DELAY (60000ms) + }), + ) + .mockResolvedValueOnce(new Response("", { status: 200 })); + + const responsePromise = requestWithRetries(() => mockFetch(), 1); + await vi.runAllTimersAsync(); + const response = await responsePromise; + + expect(setTimeoutSpy).toHaveBeenCalledWith(expect.any(Function), 60000); + expect(response.status).toBe(200); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts new file mode 100644 index 000000000000..d7b6d1e63caa --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/signals.test.ts @@ -0,0 +1,69 @@ +import { anySignal, getTimeoutSignal } from "../../../src/core/fetcher/signals"; + +describe("Test getTimeoutSignal", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should return an object with signal and abortId", () => { + const { signal, abortId } = getTimeoutSignal(1000); + + expect(signal).toBeDefined(); + expect(abortId).toBeDefined(); + expect(signal).toBeInstanceOf(AbortSignal); + expect(signal.aborted).toBe(false); + }); + + it("should create a signal that aborts after the specified timeout", () => { + const timeoutMs = 5000; + const { signal } = getTimeoutSignal(timeoutMs); + + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(timeoutMs - 1); + expect(signal.aborted).toBe(false); + + vi.advanceTimersByTime(1); + expect(signal.aborted).toBe(true); + }); +}); + +describe("Test anySignal", () => { + it("should return an AbortSignal", () => { + const signal = anySignal(new AbortController().signal); + expect(signal).toBeInstanceOf(AbortSignal); + }); + + it("should abort when any of the input signals is aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal(controller1.signal, controller2.signal); + + expect(signal.aborted).toBe(false); + controller1.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should handle an array of signals", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const signal = anySignal([controller1.signal, controller2.signal]); + + expect(signal.aborted).toBe(false); + controller2.abort(); + expect(signal.aborted).toBe(true); + }); + + it("should abort immediately if one of the input signals is already aborted", () => { + const controller1 = new AbortController(); + const controller2 = new AbortController(); + controller1.abort(); + + const signal = anySignal(controller1.signal, controller2.signal); + expect(signal.aborted).toBe(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt new file mode 100644 index 000000000000..c66d471e359c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/fetcher/test-file.txt @@ -0,0 +1 @@ +This is a test file! diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts new file mode 100644 index 000000000000..2e0b5fe5040c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/logging/logger.test.ts @@ -0,0 +1,454 @@ +import { ConsoleLogger, createLogger, Logger, LogLevel } from "../../../src/core/logging/logger"; + +function createMockLogger() { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; +} + +describe("Logger", () => { + describe("LogLevel", () => { + it("should have correct log levels", () => { + expect(LogLevel.Debug).toBe("debug"); + expect(LogLevel.Info).toBe("info"); + expect(LogLevel.Warn).toBe("warn"); + expect(LogLevel.Error).toBe("error"); + }); + }); + + describe("ConsoleLogger", () => { + let consoleLogger: ConsoleLogger; + let consoleSpy: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + consoleLogger = new ConsoleLogger(); + consoleSpy = { + debug: vi.spyOn(console, "debug").mockImplementation(() => {}), + info: vi.spyOn(console, "info").mockImplementation(() => {}), + warn: vi.spyOn(console, "warn").mockImplementation(() => {}), + error: vi.spyOn(console, "error").mockImplementation(() => {}), + }; + }); + + afterEach(() => { + consoleSpy.debug.mockRestore(); + consoleSpy.info.mockRestore(); + consoleSpy.warn.mockRestore(); + consoleSpy.error.mockRestore(); + }); + + it("should log debug messages", () => { + consoleLogger.debug("debug message", { data: "test" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("debug message", { data: "test" }); + }); + + it("should log info messages", () => { + consoleLogger.info("info message", { data: "test" }); + expect(consoleSpy.info).toHaveBeenCalledWith("info message", { data: "test" }); + }); + + it("should log warn messages", () => { + consoleLogger.warn("warn message", { data: "test" }); + expect(consoleSpy.warn).toHaveBeenCalledWith("warn message", { data: "test" }); + }); + + it("should log error messages", () => { + consoleLogger.error("error message", { data: "test" }); + expect(consoleSpy.error).toHaveBeenCalledWith("error message", { data: "test" }); + }); + + it("should handle multiple arguments", () => { + consoleLogger.debug("message", "arg1", "arg2", { key: "value" }); + expect(consoleSpy.debug).toHaveBeenCalledWith("message", "arg1", "arg2", { key: "value" }); + }); + }); + + describe("Logger with level filtering", () => { + let mockLogger: { + debug: ReturnType; + info: ReturnType; + warn: ReturnType; + error: ReturnType; + }; + + beforeEach(() => { + mockLogger = createMockLogger(); + }); + + describe("Debug level", () => { + it("should log all levels when set to debug", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).toHaveBeenCalledWith("debug"); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(true); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Info level", () => { + it("should log info, warn, and error when set to info", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).toHaveBeenCalledWith("info"); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(true); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Warn level", () => { + it("should log warn and error when set to warn", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).toHaveBeenCalledWith("warn"); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(true); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Error level", () => { + it("should only log error when set to error", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).toHaveBeenCalledWith("error"); + }); + + it("should report correct level checks", () => { + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(true); + }); + }); + + describe("Silent mode", () => { + it("should not log anything when silent is true", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + + expect(mockLogger.debug).not.toHaveBeenCalled(); + expect(mockLogger.info).not.toHaveBeenCalled(); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + }); + + it("should report all level checks as false when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.isDebug()).toBe(false); + expect(logger.isInfo()).toBe(false); + expect(logger.isWarn()).toBe(false); + expect(logger.isError()).toBe(false); + }); + }); + + describe("shouldLog", () => { + it("should correctly determine if level should be logged", () => { + const logger = new Logger({ + level: LogLevel.Info, + logger: mockLogger, + silent: false, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(true); + expect(logger.shouldLog(LogLevel.Warn)).toBe(true); + expect(logger.shouldLog(LogLevel.Error)).toBe(true); + }); + + it("should return false for all levels when silent", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: true, + }); + + expect(logger.shouldLog(LogLevel.Debug)).toBe(false); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + expect(logger.shouldLog(LogLevel.Warn)).toBe(false); + expect(logger.shouldLog(LogLevel.Error)).toBe(false); + }); + }); + + describe("Multiple arguments", () => { + it("should pass multiple arguments to logger", () => { + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message", "arg1", { key: "value" }, 123); + expect(mockLogger.debug).toHaveBeenCalledWith("message", "arg1", { key: "value" }, 123); + }); + }); + }); + + describe("createLogger", () => { + it("should return default logger when no config provided", () => { + const logger = createLogger(); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should return same logger instance when Logger is passed", () => { + const customLogger = new Logger({ + level: LogLevel.Debug, + logger: new ConsoleLogger(), + silent: false, + }); + + const result = createLogger(customLogger); + expect(result).toBe(customLogger); + }); + + it("should create logger with custom config", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Warn, + logger: mockLogger, + silent: false, + }); + + expect(logger).toBeInstanceOf(Logger); + logger.warn("test"); + expect(mockLogger.warn).toHaveBeenCalledWith("test"); + }); + + it("should use default values for missing config", () => { + const logger = createLogger({}); + expect(logger).toBeInstanceOf(Logger); + }); + + it("should override default level", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("test"); + expect(mockLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should override default silent mode", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + silent: false, + }); + + logger.info("test"); + expect(mockLogger.info).toHaveBeenCalledWith("test"); + }); + + it("should use provided logger implementation", () => { + const customLogger = createMockLogger(); + + const logger = createLogger({ + logger: customLogger, + level: LogLevel.Debug, + silent: false, + }); + + logger.debug("test"); + expect(customLogger.debug).toHaveBeenCalledWith("test"); + }); + + it("should default to silent: true", () => { + const mockLogger = createMockLogger(); + + const logger = createLogger({ + logger: mockLogger, + level: LogLevel.Debug, + }); + + logger.debug("test"); + expect(mockLogger.debug).not.toHaveBeenCalled(); + }); + }); + + describe("Default logger", () => { + it("should have silent: true by default", () => { + const logger = createLogger(); + expect(logger.shouldLog(LogLevel.Info)).toBe(false); + }); + + it("should not log when using default logger", () => { + const logger = createLogger(); + + logger.info("test"); + expect(logger.isInfo()).toBe(false); + }); + }); + + describe("Edge cases", () => { + it("should handle empty message", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug(""); + expect(mockLogger.debug).toHaveBeenCalledWith(""); + }); + + it("should handle no arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + logger.debug("message"); + expect(mockLogger.debug).toHaveBeenCalledWith("message"); + }); + + it("should handle complex objects", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Debug, + logger: mockLogger, + silent: false, + }); + + const complexObject = { + nested: { key: "value" }, + array: [1, 2, 3], + fn: () => "test", + }; + + logger.debug("message", complexObject); + expect(mockLogger.debug).toHaveBeenCalledWith("message", complexObject); + }); + + it("should handle errors as arguments", () => { + const mockLogger = createMockLogger(); + + const logger = new Logger({ + level: LogLevel.Error, + logger: mockLogger, + silent: false, + }); + + const error = new Error("Test error"); + logger.error("Error occurred", error); + expect(mockLogger.error).toHaveBeenCalledWith("Error occurred", error); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts new file mode 100644 index 000000000000..498f143c7283 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/bigint/bigint.test.ts @@ -0,0 +1,46 @@ +import { bigint } from "../../../../src/core/schemas/builders/bigint"; +import { itJson, itParse, itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("bigint", () => { + itSchema("converts between raw bigint and parsed bigint", bigint(), { + raw: BigInt("9007199254740992"), + parsed: BigInt("9007199254740992"), + }); + + itParse("converts between raw number and parsed bigint", bigint(), { + raw: 10, + parsed: BigInt("10"), + }); + + itParse("converts between raw number and parsed bigint", bigint(), { + raw: BigInt("10"), + parsed: BigInt("10"), + }); + + itJson("converts raw bigint to parsed bigint", bigint(), { + parsed: BigInt("10"), + raw: BigInt("10"), + }); + + itValidateParse("string", bigint(), "42", [ + { + message: 'Expected bigint | number. Received "42".', + path: [], + }, + ]); + + itValidateJson("number", bigint(), 42, [ + { + message: "Expected bigint. Received 42.", + path: [], + }, + ]); + + itValidateJson("string", bigint(), "42", [ + { + message: 'Expected bigint. Received "42".', + path: [], + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts new file mode 100644 index 000000000000..2790268a09c6 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/date/date.test.ts @@ -0,0 +1,31 @@ +import { date } from "../../../../src/core/schemas/builders/date"; +import { itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("date", () => { + itSchema("converts between raw ISO string and parsed Date", date(), { + raw: "2022-09-29T05:41:21.939Z", + parsed: new Date("2022-09-29T05:41:21.939Z"), + }); + + itValidateParse("non-string", date(), 42, [ + { + message: "Expected string. Received 42.", + path: [], + }, + ]); + + itValidateParse("non-ISO", date(), "hello world", [ + { + message: 'Expected ISO 8601 date string. Received "hello world".', + path: [], + }, + ]); + + itValidateJson("non-Date", date(), "hello", [ + { + message: 'Expected Date object. Received "hello".', + path: [], + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts new file mode 100644 index 000000000000..d1707325b29b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/enum/enum.test.ts @@ -0,0 +1,30 @@ +import { enum_ } from "../../../../src/core/schemas/builders/enum"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("enum", () => { + itSchemaIdentity(enum_(["A", "B", "C"]), "A"); + + itSchemaIdentity(enum_(["A", "B", "C"]), "D" as any, { + opts: { allowUnrecognizedEnumValues: true }, + }); + + itValidate("invalid enum", enum_(["A", "B", "C"]), "D", [ + { + message: 'Expected enum. Received "D".', + path: [], + }, + ]); + + itValidate( + "non-string", + enum_(["A", "B", "C"]), + [], + [ + { + message: "Expected string. Received list.", + path: [], + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts new file mode 100644 index 000000000000..a82ace4a08c0 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazy.test.ts @@ -0,0 +1,57 @@ +import { lazy, list, object, string } from "../../../../src/core/schemas/builders"; +import type { Schema } from "../../../../src/core/schemas/Schema"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("lazy", () => { + it("doesn't run immediately", () => { + let wasRun = false; + lazy(() => { + wasRun = true; + return string(); + }); + expect(wasRun).toBe(false); + }); + + it("only runs first time", async () => { + let count = 0; + const schema = lazy(() => { + count++; + return string(); + }); + await schema.parse("hello"); + await schema.json("world"); + expect(count).toBe(1); + }); + + itSchemaIdentity( + lazy(() => object({})), + { foo: "hello" }, + { + title: "passes opts through", + opts: { unrecognizedObjectKeys: "passthrough" }, + }, + ); + + itSchemaIdentity( + lazy(() => object({ foo: string() })), + { foo: "hello" }, + ); + + // eslint-disable-next-line vi/expect-expect + it("self-referencial schema doesn't compile", () => { + () => { + // @ts-expect-error + const a = lazy(() => object({ foo: a })); + }; + }); + + // eslint-disable-next-line vi/expect-expect + it("self-referencial compiles with explicit type", () => { + () => { + interface TreeNode { + children: TreeNode[]; + } + const TreeNode: Schema = lazy(() => object({ children: list(TreeNode) })); + }; + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts new file mode 100644 index 000000000000..9b443671a71f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/lazyObject.test.ts @@ -0,0 +1,18 @@ +import { lazyObject, number, object, string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("lazy", () => { + itSchemaIdentity( + lazyObject(() => object({ foo: string() })), + { foo: "hello" }, + ); + + itSchemaIdentity( + lazyObject(() => object({ foo: string() })).extend(object({ bar: number() })), + { + foo: "hello", + bar: 42, + }, + { title: "returned schema has object utils" }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts new file mode 100644 index 000000000000..8b7d5e40cfaf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/a.ts @@ -0,0 +1,7 @@ +import { object } from "../../../../../src/core/schemas/builders/object"; +import { schemaB } from "./b"; + +// @ts-expect-error +export const schemaA = object({ + b: schemaB, +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts new file mode 100644 index 000000000000..fb219d54c8e5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/lazy/recursive/b.ts @@ -0,0 +1,8 @@ +import { object } from "../../../../../src/core/schemas/builders/object"; +import { optional } from "../../../../../src/core/schemas/builders/schema-utils"; +import { schemaA } from "./a"; + +// @ts-expect-error +export const schemaB = object({ + a: optional(schemaA), +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts new file mode 100644 index 000000000000..108789b7317d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/list/list.test.ts @@ -0,0 +1,41 @@ +import { list, object, property, string } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("list", () => { + itSchemaIdentity(list(string()), ["hello", "world"], { + title: "functions as identity when item type is primitive", + }); + + itSchema( + "converts objects correctly", + list( + object({ + helloWorld: property("hello_world", string()), + }), + ), + { + raw: [{ hello_world: "123" }], + parsed: [{ helloWorld: "123" }], + }, + ); + + itValidate("not a list", list(string()), 42, [ + { + path: [], + message: "Expected list. Received 42.", + }, + ]); + + itValidate( + "invalid item type", + list(string()), + [42], + [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts new file mode 100644 index 000000000000..fa6c88873c61 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/literals/stringLiteral.test.ts @@ -0,0 +1,21 @@ +import { stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("stringLiteral", () => { + itSchemaIdentity(stringLiteral("A"), "A"); + + itValidate("incorrect string", stringLiteral("A"), "B", [ + { + path: [], + message: 'Expected "A". Received "B".', + }, + ]); + + itValidate("non-string", stringLiteral("A"), 42, [ + { + path: [], + message: 'Expected "A". Received 42.', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts new file mode 100644 index 000000000000..b18bc9d3e5df --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object-like/withParsedProperties.test.ts @@ -0,0 +1,57 @@ +import { object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; + +describe("withParsedProperties", () => { + it("Added properties included on parsed object", async () => { + const schema = object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }).withParsedProperties({ + printFoo: (parsed) => () => parsed.foo, + printHelloWorld: () => () => "Hello world", + helloWorld: "Hello world", + }); + + const parsed = await schema.parse({ raw_foo: "value of foo", bar: "bar" }); + if (!parsed.ok) { + throw new Error("Failed to parse"); + } + expect(parsed.value.printFoo()).toBe("value of foo"); + expect(parsed.value.printHelloWorld()).toBe("Hello world"); + expect(parsed.value.helloWorld).toBe("Hello world"); + }); + + it("Added property is removed on raw object", async () => { + const schema = object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }).withParsedProperties({ + printFoo: (parsed) => () => parsed.foo, + }); + + const original = { raw_foo: "value of foo", bar: "bar" } as const; + const parsed = await schema.parse(original); + if (!parsed.ok) { + throw new Error("Failed to parse()"); + } + + const raw = await schema.json(parsed.value); + + if (!raw.ok) { + throw new Error("Failed to json()"); + } + + expect(raw.value).toEqual(original); + }); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with non-object schema", () => { + () => + object({ + foo: string(), + }) + // @ts-expect-error + .withParsedProperties(42); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts new file mode 100644 index 000000000000..b6c2920f4d3e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/extend.test.ts @@ -0,0 +1,89 @@ +import { boolean, object, property, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; + +describe("extend", () => { + itSchemaIdentity( + object({ + foo: string(), + }).extend( + object({ + bar: stringLiteral("bar"), + }), + ), + { + foo: "", + bar: "bar", + } as const, + { + title: "extended properties are included in schema", + }, + ); + + itSchemaIdentity( + object({ + foo: string(), + }) + .extend( + object({ + bar: stringLiteral("bar"), + }), + ) + .extend( + object({ + baz: boolean(), + }), + ), + { + foo: "", + bar: "bar", + baz: true, + } as const, + { + title: "extensions can be extended", + }, + ); + + itSchema( + "converts nested object", + object({ + item: object({ + helloWorld: property("hello_world", string()), + }), + }).extend( + object({ + goodbye: property("goodbye_raw", string()), + }), + ), + { + raw: { item: { hello_world: "yo" }, goodbye_raw: "peace" }, + parsed: { item: { helloWorld: "yo" }, goodbye: "peace" }, + }, + ); + + itSchema( + "extensions work with raw/parsed property name conversions", + object({ + item: property("item_raw", string()), + }).extend( + object({ + goodbye: property("goodbye_raw", string()), + }), + ), + { + raw: { item_raw: "hi", goodbye_raw: "peace" }, + parsed: { item: "hi", goodbye: "peace" }, + }, + ); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with non-object schema", () => { + () => + object({ + foo: string(), + }) + // @ts-expect-error + .extend([]); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts new file mode 100644 index 000000000000..a8d9fe0a1359 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/object.test.ts @@ -0,0 +1,255 @@ +import { any, number, object, property, string, stringLiteral, unknown } from "../../../../src/core/schemas/builders"; +import { itJson, itParse, itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("object", () => { + itSchemaIdentity( + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { + foo: "", + bar: "bar", + }, + { + title: "functions as identity when values are primitives and property() isn't used", + }, + ); + + itSchema( + "uses raw key from property()", + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { raw_foo: "foo", bar: "bar" }, + parsed: { foo: "foo", bar: "bar" }, + }, + ); + + itSchema( + "keys with unknown type can be omitted", + object({ + foo: unknown(), + }), + { + raw: {}, + parsed: {}, + }, + ); + + itSchema( + "keys with any type can be omitted", + object({ + foo: any(), + }), + { + raw: {}, + parsed: {}, + }, + ); + + describe("unrecognizedObjectKeys", () => { + describe("parse", () => { + itParse( + 'includes unknown values when unrecognizedObjectKeys === "passthrough"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "passthrough", + }, + }, + ); + + itParse( + 'strips unknown values when unrecognizedObjectKeys === "strip"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + }, + opts: { + unrecognizedObjectKeys: "strip", + }, + }, + ); + }); + + describe("json", () => { + itJson( + 'includes unknown values when unrecognizedObjectKeys === "passthrough"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "passthrough", + }, + }, + ); + + itJson( + 'strips unknown values when unrecognizedObjectKeys === "strip"', + object({ + foo: property("raw_foo", string()), + bar: stringLiteral("bar"), + }), + { + raw: { + raw_foo: "foo", + bar: "bar", + }, + parsed: { + foo: "foo", + bar: "bar", + // @ts-expect-error + baz: "yoyo", + }, + opts: { + unrecognizedObjectKeys: "strip", + }, + }, + ); + }); + }); + + describe("nullish properties", () => { + itSchema("missing properties are not added", object({ foo: property("raw_foo", string().optional()) }), { + raw: {}, + parsed: {}, + }); + + itSchema("undefined properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }); + + itSchema("null properties are not dropped", object({ foo: property("raw_foo", string().optional()) }), { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }); + + describe("extensions", () => { + itSchema( + "undefined properties are not dropped", + object({}).extend(object({ foo: property("raw_foo", string().optional()) })), + { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }, + ); + + describe("parse()", () => { + itParse( + "null properties are not dropped", + object({}).extend(object({ foo: property("raw_foo", string().optional()) })), + { + raw: { raw_foo: null }, + parsed: { foo: undefined }, + }, + ); + }); + }); + }); + + itValidate( + "missing property", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { foo: "hello" }, + [ + { + path: [], + message: 'Missing required key "bar"', + }, + ], + ); + + itValidate( + "extra property", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + { foo: "hello", bar: "bar", baz: 42 }, + [ + { + path: ["baz"], + message: 'Unexpected key "baz"', + }, + ], + ); + + itValidate( + "not an object", + object({ + foo: string(), + bar: stringLiteral("bar"), + }), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate( + "nested validation error", + object({ + foo: object({ + bar: number(), + }), + }), + { foo: { bar: "hello" } }, + [ + { + path: ["foo", "bar"], + message: 'Expected number. Received "hello".', + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts new file mode 100644 index 000000000000..efcd83afae79 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/objectWithoutOptionalProperties.test.ts @@ -0,0 +1,21 @@ +import { objectWithoutOptionalProperties, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; + +describe("objectWithoutOptionalProperties", () => { + itSchema( + "all properties are required", + objectWithoutOptionalProperties({ + foo: string(), + bar: stringLiteral("bar").optional(), + }), + { + raw: { + foo: "hello", + }, + // @ts-expect-error + parsed: { + foo: "hello", + }, + }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts new file mode 100644 index 000000000000..c8770fca17dc --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/object/passthrough.test.ts @@ -0,0 +1,87 @@ +import { object, string, stringLiteral } from "../../../../src/core/schemas/builders"; +import { itJson, itParse, itSchema } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("passthrough", () => { + const baseSchema = object({ + foo: string(), + bar: stringLiteral("bar"), + }); + + describe("parse", () => { + itParse("includes unknown values", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + baz: "extra", + }, + parsed: { + foo: "hello", + bar: "bar", + baz: "extra", + }, + }); + + itValidate( + "preserves schema validation", + baseSchema.passthrough(), + { + foo: 123, + bar: "bar", + baz: "extra", + }, + [ + { + path: ["foo"], + message: "Expected string. Received 123.", + }, + ], + ); + }); + + describe("json", () => { + itJson("includes unknown values", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + + baz: "extra", + }, + parsed: { + foo: "hello", + bar: "bar", + + baz: "extra", + }, + }); + + itValidate( + "preserves schema validation", + baseSchema.passthrough(), + { + foo: "hello", + bar: "wrong", + baz: "extra", + }, + [ + { + path: ["bar"], + message: 'Expected "bar". Received "wrong".', + }, + ], + ); + }); + + itSchema("preserves schema validation in both directions", baseSchema.passthrough(), { + raw: { + foo: "hello", + bar: "bar", + extra: 42, + }, + parsed: { + foo: "hello", + bar: "bar", + extra: 42, + }, + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts new file mode 100644 index 000000000000..1adbbe2a8380 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/any.test.ts @@ -0,0 +1,6 @@ +import { any } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("any", () => { + itSchemaIdentity(any(), true); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts new file mode 100644 index 000000000000..897a8295dca7 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/boolean.test.ts @@ -0,0 +1,14 @@ +import { boolean } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("boolean", () => { + itSchemaIdentity(boolean(), true); + + itValidate("non-boolean", boolean(), {}, [ + { + path: [], + message: "Expected boolean. Received object.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts new file mode 100644 index 000000000000..1d18eba052ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/never.test.ts @@ -0,0 +1,54 @@ +import { never } from "../../../../src/core/schemas/builders"; + +describe("never", () => { + it("always fails to parse", () => { + const schema = never(); + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("always fails to json", () => { + const schema = never(); + const result = schema.json("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + } + }); + + it("fails with any value including undefined", () => { + const schema = never(); + expect(schema.parse(undefined).ok).toBe(false); + expect(schema.parse(null).ok).toBe(false); + expect(schema.parse(0).ok).toBe(false); + expect(schema.parse("").ok).toBe(false); + expect(schema.parse({}).ok).toBe(false); + expect(schema.parse([]).ok).toBe(false); + }); + + it("works when called without options parameter", () => { + const schema = never(); + // This tests that the default = {} parameter works correctly + const result = schema.parse("test"); + expect(result.ok).toBe(false); + if (!result.ok) { + expect(result.errors).toHaveLength(1); + expect(result.errors[0]?.message).toBe("Expected never"); + expect(result.errors[0]?.path).toEqual([]); + } + }); + + it("succeeds with skipValidation", () => { + const schema = never(); + const result = schema.parse("test", { skipValidation: true }); + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.value).toBe("test"); + } + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts new file mode 100644 index 000000000000..2d01415a60ba --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/number.test.ts @@ -0,0 +1,14 @@ +import { number } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("number", () => { + itSchemaIdentity(number(), 42); + + itValidate("non-number", number(), "hello", [ + { + path: [], + message: 'Expected number. Received "hello".', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts new file mode 100644 index 000000000000..57b2368784ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/string.test.ts @@ -0,0 +1,14 @@ +import { string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("string", () => { + itSchemaIdentity(string(), "hello"); + + itValidate("non-string", string(), 42, [ + { + path: [], + message: "Expected string. Received 42.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts new file mode 100644 index 000000000000..4d17a7dbd005 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/primitives/unknown.test.ts @@ -0,0 +1,6 @@ +import { unknown } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; + +describe("unknown", () => { + itSchemaIdentity(unknown(), true); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts new file mode 100644 index 000000000000..e07f3e7cb00d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/record/record.test.ts @@ -0,0 +1,34 @@ +import { number, record, string } from "../../../../src/core/schemas/builders"; +import { itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("record", () => { + itSchemaIdentity(record(string(), string()), { hello: "world" }); + itSchemaIdentity(record(number(), string()), { 42: "world" }); + + itValidate( + "non-record", + record(number(), string()), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate("invalid key type", record(number(), string()), { hello: "world" }, [ + { + path: ["hello (key)"], + message: 'Expected number. Received "hello".', + }, + ]); + + itValidate("invalid value type", record(string(), number()), { hello: "world" }, [ + { + path: ["hello"], + message: 'Expected number. Received "world".', + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts new file mode 100644 index 000000000000..822c3ca4e5a4 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema-utils/getSchemaUtils.test.ts @@ -0,0 +1,83 @@ +import { object, string } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; + +describe("getSchemaUtils", () => { + describe("optional()", () => { + itSchema("optional fields allow original schema", string().optional(), { + raw: "hello", + parsed: "hello", + }); + + itSchema("optional fields are not required", string().optional(), { + raw: null, + parsed: undefined, + }); + }); + + describe("transform()", () => { + itSchema( + "transform and untransform run correctly", + string().transform({ + transform: (x) => `${x}X`, + untransform: (x) => (x as string).slice(0, -1), + }), + { + raw: "hello", + parsed: "helloX", + }, + ); + }); + + describe("parseOrThrow()", () => { + it("parses valid value", async () => { + const value = string().parseOrThrow("hello"); + expect(value).toBe("hello"); + }); + + it("throws on invalid value", async () => { + const value = () => object({ a: string(), b: string() }).parseOrThrow({ a: 24 }); + expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); + }); + }); + + describe("jsonOrThrow()", () => { + it("serializes valid value", async () => { + const value = string().jsonOrThrow("hello"); + expect(value).toBe("hello"); + }); + + it("throws on invalid value", async () => { + const value = () => object({ a: string(), b: string() }).jsonOrThrow({ a: 24 }); + expect(value).toThrowError('a: Expected string. Received 24.; Missing required key "b"'); + }); + }); + + describe("omitUndefined", () => { + it("serializes undefined as null", async () => { + const value = object({ + a: string().optional(), + b: string().optional(), + }).jsonOrThrow({ + a: "hello", + b: undefined, + }); + expect(value).toEqual({ a: "hello", b: null }); + }); + + it("omits undefined values", async () => { + const value = object({ + a: string().optional(), + b: string().optional(), + }).jsonOrThrow( + { + a: "hello", + b: undefined, + }, + { + omitUndefined: true, + }, + ); + expect(value).toEqual({ a: "hello" }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts new file mode 100644 index 000000000000..13842ff40157 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/schema.test.ts @@ -0,0 +1,78 @@ +import { + boolean, + discriminant, + list, + number, + object, + string, + stringLiteral, + union, +} from "../../../src/core/schemas/builders"; +import { booleanLiteral } from "../../../src/core/schemas/builders/literals/booleanLiteral"; +import { property } from "../../../src/core/schemas/builders/object/property"; +import { itSchema } from "./utils/itSchema"; + +describe("Schema", () => { + itSchema( + "large nested object", + object({ + a: string(), + b: stringLiteral("b value"), + c: property( + "raw_c", + list( + object({ + animal: union(discriminant("type", "_type"), { + dog: object({ value: boolean() }), + cat: object({ value: property("raw_cat", number()) }), + }), + }), + ), + ), + d: property("raw_d", boolean()), + e: booleanLiteral(true), + }), + { + raw: { + a: "hello", + b: "b value", + raw_c: [ + { + animal: { + _type: "dog", + value: true, + }, + }, + { + animal: { + _type: "cat", + raw_cat: 42, + }, + }, + ], + raw_d: false, + e: true, + }, + parsed: { + a: "hello", + b: "b value", + c: [ + { + animal: { + type: "dog", + value: true, + }, + }, + { + animal: { + type: "cat", + value: 42, + }, + }, + ], + d: false, + e: true, + }, + }, + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts new file mode 100644 index 000000000000..53a1652c8bbb --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/set/set.test.ts @@ -0,0 +1,48 @@ +import { set, string } from "../../../../src/core/schemas/builders"; +import { itSchema } from "../utils/itSchema"; +import { itValidateJson, itValidateParse } from "../utils/itValidate"; + +describe("set", () => { + itSchema("converts between raw list and parsed Set", set(string()), { + raw: ["A", "B"], + parsed: new Set(["A", "B"]), + }); + + itValidateParse("not a list", set(string()), 42, [ + { + path: [], + message: "Expected list. Received 42.", + }, + ]); + + itValidateJson( + "not a Set", + set(string()), + [], + [ + { + path: [], + message: "Expected Set. Received list.", + }, + ], + ); + + itValidateParse( + "invalid item type", + set(string()), + [42], + [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ], + ); + + itValidateJson("invalid item type", set(string()), new Set([42]), [ + { + path: ["[0]"], + message: "Expected string. Received 42.", + }, + ]); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts new file mode 100644 index 000000000000..3283555949ab --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/skipValidation.test.ts @@ -0,0 +1,44 @@ +/* eslint-disable no-console */ +import { boolean, number, object, property, string, undiscriminatedUnion } from "../../../src/core/schemas/builders"; + +describe("skipValidation", () => { + it("allows data that doesn't conform to the schema", async () => { + const warningLogs: string[] = []; + const originalConsoleWarn = console.warn; + console.warn = (...args) => warningLogs.push(args.join(" ")); + + const schema = object({ + camelCase: property("snake_case", string()), + numberProperty: number(), + requiredProperty: boolean(), + anyPrimitive: undiscriminatedUnion([string(), number(), boolean()]), + }); + + const parsed = await schema.parse( + { + snake_case: "hello", + numberProperty: "oops", + anyPrimitive: true, + }, + { + skipValidation: true, + }, + ); + + expect(parsed).toEqual({ + ok: true, + value: { + camelCase: "hello", + numberProperty: "oops", + anyPrimitive: true, + }, + }); + + expect(warningLogs).toEqual([ + `Failed to validate. + - numberProperty: Expected number. Received "oops".`, + ]); + + console.warn = originalConsoleWarn; + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts new file mode 100644 index 000000000000..01dcadbba37b --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/undiscriminated-union/undiscriminatedUnion.test.ts @@ -0,0 +1,44 @@ +import { number, object, property, string, undiscriminatedUnion } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; + +describe("undiscriminatedUnion", () => { + itSchemaIdentity(undiscriminatedUnion([string(), number()]), "hello world"); + + itSchemaIdentity(undiscriminatedUnion([object({ hello: string() }), object({ goodbye: string() })]), { + goodbye: "foo", + }); + + itSchema( + "Correctly transforms", + undiscriminatedUnion([object({ hello: string() }), object({ helloWorld: property("hello_world", string()) })]), + { + raw: { hello_world: "foo " }, + parsed: { helloWorld: "foo " }, + }, + ); + + it("Returns errors for all variants", async () => { + const result = await undiscriminatedUnion([string(), number()]).parse(true); + if (result.ok) { + throw new Error("Unexpectedly passed validation"); + } + expect(result.errors).toEqual([ + { + message: "[Variant 0] Expected string. Received true.", + path: [], + }, + { + message: "[Variant 1] Expected number. Received true.", + path: [], + }, + ]); + }); + + describe("compile", () => { + // eslint-disable-next-line vi/expect-expect + it("doesn't compile with zero members", () => { + // @ts-expect-error + () => undiscriminatedUnion([]); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts new file mode 100644 index 000000000000..1f5d7a8fad5c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/union/union.test.ts @@ -0,0 +1,113 @@ +import { boolean, discriminant, number, object, string, union } from "../../../../src/core/schemas/builders"; +import { itSchema, itSchemaIdentity } from "../utils/itSchema"; +import { itValidate } from "../utils/itValidate"; + +describe("union", () => { + itSchemaIdentity( + union("type", { + lion: object({ + meows: boolean(), + }), + giraffe: object({ + heightInInches: number(), + }), + }), + { type: "lion", meows: true }, + { title: "doesn't transform discriminant when it's a string" }, + ); + + itSchema( + "transforms discriminant when it's a discriminant()", + union(discriminant("type", "_type"), { + lion: object({ meows: boolean() }), + giraffe: object({ heightInInches: number() }), + }), + { + raw: { _type: "lion", meows: true }, + parsed: { type: "lion", meows: true }, + }, + ); + + describe("allowUnrecognizedUnionMembers", () => { + itSchema( + "transforms discriminant & passes through values when discriminant value is unrecognized", + union(discriminant("type", "_type"), { + lion: object({ meows: boolean() }), + giraffe: object({ heightInInches: number() }), + }), + { + // @ts-expect-error + raw: { _type: "moose", isAMoose: true }, + // @ts-expect-error + parsed: { type: "moose", isAMoose: true }, + opts: { + allowUnrecognizedUnionMembers: true, + }, + }, + ); + }); + + describe("withParsedProperties", () => { + it("Added property is included on parsed object", async () => { + const schema = union("type", { + lion: object({}), + tiger: object({ value: string() }), + }).withParsedProperties({ + printType: (parsed) => () => parsed.type, + }); + + const parsed = await schema.parse({ type: "lion" }); + if (!parsed.ok) { + throw new Error("Failed to parse"); + } + expect(parsed.value.printType()).toBe("lion"); + }); + }); + + itValidate( + "non-object", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + [], + [ + { + path: [], + message: "Expected object. Received list.", + }, + ], + ); + + itValidate( + "missing discriminant", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + {}, + [ + { + path: [], + message: 'Missing discriminant ("type")', + }, + ], + ); + + itValidate( + "unrecognized discriminant value", + union("type", { + lion: object({}), + tiger: object({ value: string() }), + }), + { + type: "bear", + }, + [ + { + path: ["type"], + message: 'Expected enum. Received "bear".', + }, + ], + ); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts new file mode 100644 index 000000000000..25b13e643207 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itSchema.ts @@ -0,0 +1,78 @@ +/* eslint-disable vi/no-export */ +import type { Schema, SchemaOptions } from "../../../../src/core/schemas/Schema"; + +export function itSchemaIdentity( + schema: Schema, + value: T, + { title = "functions as identity", opts }: { title?: string; opts?: SchemaOptions } = {}, +): void { + itSchema(title, schema, { raw: value, parsed: value, opts }); +} + +export function itSchema( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + only = false, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + only?: boolean; + }, +): void { + // eslint-disable-next-line vi/valid-title + (only ? describe.only : describe)(title, () => { + itParse("parse()", schema, { raw, parsed, opts }); + itJson("json()", schema, { raw, parsed, opts }); + }); +} + +export function itParse( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + }, +): void { + // eslint-disable-next-line vi/valid-title + it(title, () => { + const maybeValid = schema.parse(raw, opts); + if (!maybeValid.ok) { + throw new Error(`Failed to parse() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); + } + expect(maybeValid.value).toStrictEqual(parsed); + }); +} + +export function itJson( + title: string, + schema: Schema, + { + raw, + parsed, + opts, + }: { + raw: Raw; + parsed: Parsed; + opts?: SchemaOptions; + }, +): void { + // eslint-disable-next-line vi/valid-title + it(title, () => { + const maybeValid = schema.json(parsed, opts); + if (!maybeValid.ok) { + throw new Error(`Failed to json() ${JSON.stringify(maybeValid.errors, undefined, 4)}`); + } + expect(maybeValid.value).toStrictEqual(raw); + }); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts new file mode 100644 index 000000000000..60bc56c123cf --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/schemas/utils/itValidate.ts @@ -0,0 +1,56 @@ +/* eslint-disable vi/no-export */ +import type { Schema, SchemaOptions, ValidationError } from "../../../../src/core/schemas/Schema"; + +export function itValidate( + title: string, + schema: Schema, + input: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + // eslint-disable-next-line vi/valid-title + describe("parse()", () => { + itValidateParse(title, schema, input, errors, opts); + }); + describe("json()", () => { + itValidateJson(title, schema, input, errors, opts); + }); +} + +export function itValidateParse( + title: string, + schema: Schema, + raw: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + describe("parse", () => { + // eslint-disable-next-line vi/valid-title + it(title, async () => { + const maybeValid = await schema.parse(raw, opts); + if (maybeValid.ok) { + throw new Error("Value passed validation"); + } + expect(maybeValid.errors).toStrictEqual(errors); + }); + }); +} + +export function itValidateJson( + title: string, + schema: Schema, + parsed: unknown, + errors: ValidationError[], + opts?: SchemaOptions, +): void { + describe("json", () => { + // eslint-disable-next-line vi/valid-title + it(title, async () => { + const maybeValid = await schema.json(parsed, opts); + if (maybeValid.ok) { + throw new Error("Value passed validation"); + } + expect(maybeValid.errors).toStrictEqual(errors); + }); + }); +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts new file mode 100644 index 000000000000..123488f084ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/join.test.ts @@ -0,0 +1,284 @@ +import { join } from "../../../src/core/url/index"; + +describe("join", () => { + interface TestCase { + description: string; + base: string; + segments: string[]; + expected: string; + } + + describe("basic functionality", () => { + const basicTests: TestCase[] = [ + { description: "should return empty string for empty base", base: "", segments: [], expected: "" }, + { + description: "should return empty string for empty base with path", + base: "", + segments: ["path"], + expected: "", + }, + { + description: "should handle single segment", + base: "base", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with trailing slash on base", + base: "base/", + segments: ["segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with leading slash", + base: "base", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle single segment with both slashes", + base: "base/", + segments: ["/segment"], + expected: "base/segment", + }, + { + description: "should handle multiple segments", + base: "base", + segments: ["path1", "path2", "path3"], + expected: "base/path1/path2/path3", + }, + { + description: "should handle multiple segments with slashes", + base: "base/", + segments: ["/path1/", "/path2/", "/path3/"], + expected: "base/path1/path2/path3/", + }, + ]; + + basicTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("URL handling", () => { + const urlTests: TestCase[] = [ + { + description: "should handle absolute URLs", + base: "https://example.com", + segments: ["api", "v1"], + expected: "https://example.com/api/v1", + }, + { + description: "should handle absolute URLs with slashes", + base: "https://example.com/", + segments: ["/api/", "/v1/"], + expected: "https://example.com/api/v1/", + }, + { + description: "should handle absolute URLs with base path", + base: "https://example.com/base", + segments: ["api", "v1"], + expected: "https://example.com/base/api/v1", + }, + { + description: "should preserve URL query parameters", + base: "https://example.com?query=1", + segments: ["api"], + expected: "https://example.com/api?query=1", + }, + { + description: "should preserve URL fragments", + base: "https://example.com#fragment", + segments: ["api"], + expected: "https://example.com/api#fragment", + }, + { + description: "should preserve URL query and fragments", + base: "https://example.com?query=1#fragment", + segments: ["api"], + expected: "https://example.com/api?query=1#fragment", + }, + { + description: "should handle http protocol", + base: "http://example.com", + segments: ["api"], + expected: "http://example.com/api", + }, + { + description: "should handle ftp protocol", + base: "ftp://example.com", + segments: ["files"], + expected: "ftp://example.com/files", + }, + { + description: "should handle ws protocol", + base: "ws://example.com", + segments: ["socket"], + expected: "ws://example.com/socket", + }, + { + description: "should fallback to path joining for malformed URLs", + base: "not-a-url://", + segments: ["path"], + expected: "not-a-url:///path", + }, + ]; + + urlTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("edge cases", () => { + const edgeCaseTests: TestCase[] = [ + { + description: "should handle empty segments", + base: "base", + segments: ["", "path"], + expected: "base/path", + }, + { + description: "should handle null segments", + base: "base", + segments: [null as any, "path"], + expected: "base/path", + }, + { + description: "should handle undefined segments", + base: "base", + segments: [undefined as any, "path"], + expected: "base/path", + }, + { + description: "should handle segments with only single slash", + base: "base", + segments: ["/", "path"], + expected: "base/path", + }, + { + description: "should handle segments with only double slash", + base: "base", + segments: ["//", "path"], + expected: "base/path", + }, + { + description: "should handle base paths with trailing slashes", + base: "base/", + segments: ["path"], + expected: "base/path", + }, + { + description: "should handle complex nested paths", + base: "api/v1/", + segments: ["/users/", "/123/", "/profile"], + expected: "api/v1/users/123/profile", + }, + ]; + + edgeCaseTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("real-world scenarios", () => { + const realWorldTests: TestCase[] = [ + { + description: "should handle API endpoint construction", + base: "https://api.example.com/v1", + segments: ["users", "123", "posts"], + expected: "https://api.example.com/v1/users/123/posts", + }, + { + description: "should handle file path construction", + base: "/var/www", + segments: ["html", "assets", "images"], + expected: "/var/www/html/assets/images", + }, + { + description: "should handle relative path construction", + base: "../parent", + segments: ["child", "grandchild"], + expected: "../parent/child/grandchild", + }, + { + description: "should handle Windows-style paths", + base: "C:\\Users", + segments: ["Documents", "file.txt"], + expected: "C:\\Users/Documents/file.txt", + }, + ]; + + realWorldTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); + + describe("performance scenarios", () => { + it("should handle many segments efficiently", () => { + const segments = Array(100).fill("segment"); + const result = join("base", ...segments); + expect(result).toBe(`base/${segments.join("/")}`); + }); + + it("should handle long URLs", () => { + const longPath = "a".repeat(1000); + expect(join("https://example.com", longPath)).toBe(`https://example.com/${longPath}`); + }); + }); + + describe("trailing slash preservation", () => { + const trailingSlashTests: TestCase[] = [ + { + description: + "should preserve trailing slash on final result when base has trailing slash and no segments", + base: "https://api.example.com/", + segments: [], + expected: "https://api.example.com/", + }, + { + description: "should preserve trailing slash on v1 path", + base: "https://api.example.com/v1/", + segments: [], + expected: "https://api.example.com/v1/", + }, + { + description: "should preserve trailing slash when last segment has trailing slash", + base: "https://api.example.com", + segments: ["users/"], + expected: "https://api.example.com/users/", + }, + { + description: "should preserve trailing slash with relative path", + base: "api/v1", + segments: ["users/"], + expected: "api/v1/users/", + }, + { + description: "should preserve trailing slash with multiple segments", + base: "https://api.example.com", + segments: ["v1", "collections/"], + expected: "https://api.example.com/v1/collections/", + }, + { + description: "should preserve trailing slash with base path", + base: "base", + segments: ["path1", "path2/"], + expected: "base/path1/path2/", + }, + ]; + + trailingSlashTests.forEach(({ description, base, segments, expected }) => { + it(description, () => { + expect(join(base, ...segments)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts new file mode 100644 index 000000000000..42cdffb9e5ea --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/unit/url/qs.test.ts @@ -0,0 +1,278 @@ +import { toQueryString } from "../../../src/core/url/index"; + +describe("Test qs toQueryString", () => { + interface BasicTestCase { + description: string; + input: any; + expected: string; + } + + describe("Basic functionality", () => { + const basicTests: BasicTestCase[] = [ + { description: "should return empty string for null", input: null, expected: "" }, + { description: "should return empty string for undefined", input: undefined, expected: "" }, + { description: "should return empty string for string primitive", input: "hello", expected: "" }, + { description: "should return empty string for number primitive", input: 42, expected: "" }, + { description: "should return empty string for true boolean", input: true, expected: "" }, + { description: "should return empty string for false boolean", input: false, expected: "" }, + { description: "should handle empty objects", input: {}, expected: "" }, + { + description: "should handle simple key-value pairs", + input: { name: "John", age: 30 }, + expected: "name=John&age=30", + }, + ]; + + basicTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Array handling", () => { + interface ArrayTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const arrayTests: ArrayTestCase[] = [ + { + description: "should handle arrays with indices format (default)", + input: { items: ["a", "b", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b&items%5B2%5D=c", + }, + { + description: "should handle arrays with repeat format", + input: { items: ["a", "b", "c"] }, + options: { arrayFormat: "repeat" }, + expected: "items=a&items=b&items=c", + }, + { + description: "should handle empty arrays", + input: { items: [] }, + expected: "", + }, + { + description: "should handle arrays with mixed types", + input: { mixed: ["string", 42, true, false] }, + expected: "mixed%5B0%5D=string&mixed%5B1%5D=42&mixed%5B2%5D=true&mixed%5B3%5D=false", + }, + { + description: "should handle arrays with objects", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + expected: "users%5B0%5D%5Bname%5D=John&users%5B1%5D%5Bname%5D=Jane", + }, + { + description: "should handle arrays with objects in repeat format", + input: { users: [{ name: "John" }, { name: "Jane" }] }, + options: { arrayFormat: "repeat" }, + expected: "users%5Bname%5D=John&users%5Bname%5D=Jane", + }, + ]; + + arrayTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Nested objects", () => { + const nestedTests: BasicTestCase[] = [ + { + description: "should handle nested objects", + input: { user: { name: "John", age: 30 } }, + expected: "user%5Bname%5D=John&user%5Bage%5D=30", + }, + { + description: "should handle deeply nested objects", + input: { user: { profile: { name: "John", settings: { theme: "dark" } } } }, + expected: "user%5Bprofile%5D%5Bname%5D=John&user%5Bprofile%5D%5Bsettings%5D%5Btheme%5D=dark", + }, + { + description: "should handle empty nested objects", + input: { user: {} }, + expected: "", + }, + ]; + + nestedTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Encoding", () => { + interface EncodingTestCase { + description: string; + input: any; + options?: { encode?: boolean }; + expected: string; + } + + const encodingTests: EncodingTestCase[] = [ + { + description: "should encode by default", + input: { name: "John Doe", email: "john@example.com" }, + expected: "name=John%20Doe&email=john%40example.com", + }, + { + description: "should not encode when encode is false", + input: { name: "John Doe", email: "john@example.com" }, + options: { encode: false }, + expected: "name=John Doe&email=john@example.com", + }, + { + description: "should encode special characters in keys", + input: { "user name": "John", "email[primary]": "john@example.com" }, + expected: "user%20name=John&email%5Bprimary%5D=john%40example.com", + }, + { + description: "should not encode special characters in keys when encode is false", + input: { "user name": "John", "email[primary]": "john@example.com" }, + options: { encode: false }, + expected: "user name=John&email[primary]=john@example.com", + }, + ]; + + encodingTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Mixed scenarios", () => { + interface MixedTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices" }; + expected: string; + } + + const mixedTests: MixedTestCase[] = [ + { + description: "should handle complex nested structures", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + expected: + "filters%5Bstatus%5D%5B0%5D=active&filters%5Bstatus%5D%5B1%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D%5B0%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D%5B1%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle complex nested structures with repeat format", + input: { + filters: { + status: ["active", "pending"], + category: { + type: "electronics", + subcategories: ["phones", "laptops"], + }, + }, + sort: { field: "name", direction: "asc" }, + }, + options: { arrayFormat: "repeat" }, + expected: + "filters%5Bstatus%5D=active&filters%5Bstatus%5D=pending&filters%5Bcategory%5D%5Btype%5D=electronics&filters%5Bcategory%5D%5Bsubcategories%5D=phones&filters%5Bcategory%5D%5Bsubcategories%5D=laptops&sort%5Bfield%5D=name&sort%5Bdirection%5D=asc", + }, + { + description: "should handle arrays with null/undefined values", + input: { items: ["a", null, "c", undefined, "e"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c&items%5B4%5D=e", + }, + { + description: "should handle objects with null/undefined values", + input: { name: "John", age: null, email: undefined, active: true }, + expected: "name=John&age=&active=true", + }, + ]; + + mixedTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); + + describe("Edge cases", () => { + const edgeCaseTests: BasicTestCase[] = [ + { + description: "should handle numeric keys", + input: { "0": "zero", "1": "one" }, + expected: "0=zero&1=one", + }, + { + description: "should handle boolean values in objects", + input: { enabled: true, disabled: false }, + expected: "enabled=true&disabled=false", + }, + { + description: "should handle empty strings", + input: { name: "", description: "test" }, + expected: "name=&description=test", + }, + { + description: "should handle zero values", + input: { count: 0, price: 0.0 }, + expected: "count=0&price=0", + }, + { + description: "should handle arrays with empty strings", + input: { items: ["a", "", "c"] }, + expected: "items%5B0%5D=a&items%5B1%5D=&items%5B2%5D=c", + }, + ]; + + edgeCaseTests.forEach(({ description, input, expected }) => { + it(description, () => { + expect(toQueryString(input)).toBe(expected); + }); + }); + }); + + describe("Options combinations", () => { + interface OptionsTestCase { + description: string; + input: any; + options?: { arrayFormat?: "repeat" | "indices"; encode?: boolean }; + expected: string; + } + + const optionsTests: OptionsTestCase[] = [ + { + description: "should respect both arrayFormat and encode options", + input: { items: ["a & b", "c & d"] }, + options: { arrayFormat: "repeat", encode: false }, + expected: "items=a & b&items=c & d", + }, + { + description: "should use default options when none provided", + input: { items: ["a", "b"] }, + expected: "items%5B0%5D=a&items%5B1%5D=b", + }, + { + description: "should merge provided options with defaults", + input: { items: ["a", "b"], name: "John Doe" }, + options: { encode: false }, + expected: "items[0]=a&items[1]=b&name=John Doe", + }, + ]; + + optionsTests.forEach(({ description, input, options, expected }) => { + it(description, () => { + expect(toQueryString(input, options)).toBe(expected); + }); + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts new file mode 100644 index 000000000000..98b9ec0c58b9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/container.test.ts @@ -0,0 +1,170 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContainerClient", () => { + test("getAndReturnListOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string", "string"]; + const rawResponseBody = ["string", "string"]; + server + .mockEndpoint() + .post("/container/list-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfPrimitives(["string", "string"]); + expect(response).toEqual(["string", "string"]); + }); + + test("getAndReturnListOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }, { string: "string" }]; + const rawResponseBody = [{ string: "string" }, { string: "string" }]; + server + .mockEndpoint() + .post("/container/list-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnListOfObjects([ + { + string: "string", + }, + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + { + string: "string", + }, + ]); + }); + + test("getAndReturnSetOfPrimitives", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = ["string"]; + const rawResponseBody = ["string"]; + server + .mockEndpoint() + .post("/container/set-of-primitives") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfPrimitives(new Set(["string"])); + expect(response).toEqual(new Set(["string"])); + }); + + test("getAndReturnSetOfObjects", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [{ string: "string" }]; + const rawResponseBody = [{ string: "string" }]; + server + .mockEndpoint() + .post("/container/set-of-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnSetOfObjects([ + { + string: "string", + }, + ]); + expect(response).toEqual([ + { + string: "string", + }, + ]); + }); + + test("getAndReturnMapPrimToPrim", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/map-prim-to-prim") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapPrimToPrim({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnMapOfPrimToObject", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: { string: "string" } }; + const rawResponseBody = { string: { string: "string" } }; + server + .mockEndpoint() + .post("/container/map-prim-to-object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnMapOfPrimToObject({ + string: { + string: "string", + }, + }); + expect(response).toEqual({ + string: { + string: "string", + }, + }); + }); + + test("getAndReturnOptional", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/container/opt-objects") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.container.getAndReturnOptional({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts new file mode 100644 index 000000000000..4bc8916f7ce5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/contentType.test.ts @@ -0,0 +1,88 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ContentTypeClient", () => { + test("postJsonPatchContentType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/bar").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); + + test("postJsonPatchContentWithCharsetType", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + + server.mockEndpoint().post("/foo/baz").jsonBody(rawRequestBody).respondWith().statusCode(200).build(); + + const response = await client.endpoints.contentType.postJsonPatchContentWithCharsetType({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts new file mode 100644 index 000000000000..5770be42a097 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/enum.test.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("EnumClient", () => { + test("getAndReturnEnum", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SUNNY"; + const rawResponseBody = "SUNNY"; + server + .mockEndpoint() + .post("/enum") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.enum.getAndReturnEnum("SUNNY"); + expect(response).toEqual("SUNNY"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts new file mode 100644 index 000000000000..b9e26c032ff9 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/httpMethods.test.ts @@ -0,0 +1,212 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("HttpMethodsClient", () => { + test("testGet", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/http-methods/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.httpMethods.testGet("id"); + expect(response).toEqual("string"); + }); + + test("testPost", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/http-methods") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPost({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPut", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .put("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPut("id", { + string: "string", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testPatch", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .patch("/http-methods/id") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testPatch("id", { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("testDelete", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = true; + server + .mockEndpoint() + .delete("/http-methods/id") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.httpMethods.testDelete("id"); + expect(response).toEqual(true); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts new file mode 100644 index 000000000000..685826602e5e --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/object.test.ts @@ -0,0 +1,448 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ObjectClient", () => { + test("getAndReturnWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/object/get-and-return-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithOptionalField({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("getAndReturnWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { string: "string" }; + const rawResponseBody = { string: "string" }; + server + .mockEndpoint() + .post("/object/get-and-return-with-required-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithRequiredField({ + string: "string", + }); + expect(response).toEqual({ + string: "string", + }); + }); + + test("getAndReturnWithMapOfMap", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { map: { map: { map: "map" } } }; + const rawResponseBody = { map: { map: { map: "map" } } }; + server + .mockEndpoint() + .post("/object/get-and-return-with-map-of-map") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnWithMapOfMap({ + map: { + map: { + map: "map", + }, + }, + }); + expect(response).toEqual({ + map: { + map: { + map: "map", + }, + }, + }); + }); + + test("getAndReturnNestedWithOptionalField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-optional-field") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithOptionalField({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredField", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredField("string", { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); + + test("getAndReturnNestedWithRequiredFieldAsList", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = [ + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }, + ]; + const rawResponseBody = { + string: "string", + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + server + .mockEndpoint() + .post("/object/get-and-return-nested-with-required-field-list") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.object.getAndReturnNestedWithRequiredFieldAsList([ + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + { + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }, + ]); + expect(response).toEqual({ + string: "string", + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts new file mode 100644 index 000000000000..be2e7ddd6591 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/params.test.ts @@ -0,0 +1,120 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("ParamsClient", () => { + test("getWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithPath("param"); + expect(response).toEqual("string"); + }); + + test("getWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/params/path/param").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.params.getWithInlinePath({ + param: "param", + }); + expect(response).toEqual("string"); + }); + + test("getWithQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithAllowMultipleQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithAllowMultipleQuery({ + query: "query", + number: 1, + }); + expect(response).toEqual(undefined); + }); + + test("getWithPathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithPathAndQuery("param", { + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("getWithInlinePathAndQuery", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + server.mockEndpoint().get("/params/path-query/param").respondWith().statusCode(200).build(); + + const response = await client.endpoints.params.getWithInlinePathAndQuery({ + param: "param", + query: "query", + }); + expect(response).toEqual(undefined); + }); + + test("modifyWithPath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithPath("param", "string"); + expect(response).toEqual("string"); + }); + + test("modifyWithInlinePath", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .put("/params/path/param") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.params.modifyWithInlinePath({ + param: "param", + body: "string", + }); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts new file mode 100644 index 000000000000..650fc620bb1d --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/primitive.test.ts @@ -0,0 +1,168 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PrimitiveClient", () => { + test("getAndReturnString", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + const rawResponseBody = "string"; + server + .mockEndpoint() + .post("/primitive/string") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnString("string"); + expect(response).toEqual("string"); + }); + + test("getAndReturnInt", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1; + const rawResponseBody = 1; + server + .mockEndpoint() + .post("/primitive/integer") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnInt(1); + expect(response).toEqual(1); + }); + + test("getAndReturnLong", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1000000; + const rawResponseBody = 1000000; + server + .mockEndpoint() + .post("/primitive/long") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnLong(1000000); + expect(response).toEqual(1000000); + }); + + test("getAndReturnDouble", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = 1.1; + const rawResponseBody = 1.1; + server + .mockEndpoint() + .post("/primitive/double") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDouble(1.1); + expect(response).toEqual(1.1); + }); + + test("getAndReturnBool", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = true; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/primitive/boolean") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBool(true); + expect(response).toEqual(true); + }); + + test("getAndReturnDatetime", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2024-01-15T09:30:00Z"; + const rawResponseBody = "2024-01-15T09:30:00Z"; + server + .mockEndpoint() + .post("/primitive/datetime") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDatetime(new Date("2024-01-15T09:30:00.000Z")); + expect(response).toEqual(new Date("2024-01-15T09:30:00.000Z")); + }); + + test("getAndReturnDate", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "2023-01-15"; + const rawResponseBody = "2023-01-15"; + server + .mockEndpoint() + .post("/primitive/date") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnDate("2023-01-15"); + expect(response).toEqual("2023-01-15"); + }); + + test("getAndReturnUUID", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + const rawResponseBody = "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"; + server + .mockEndpoint() + .post("/primitive/uuid") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnUuid("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + expect(response).toEqual("d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32"); + }); + + test("getAndReturnBase64", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "SGVsbG8gd29ybGQh"; + const rawResponseBody = "SGVsbG8gd29ybGQh"; + server + .mockEndpoint() + .post("/primitive/base64") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.primitive.getAndReturnBase64("SGVsbG8gd29ybGQh"); + expect(response).toEqual("SGVsbG8gd29ybGQh"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts new file mode 100644 index 000000000000..1481521d77b5 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/put.test.ts @@ -0,0 +1,39 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("PutClient", () => { + test("add", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + errors: [ + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + { category: "API_ERROR", code: "INTERNAL_SERVER_ERROR", detail: "detail", field: "field" }, + ], + }; + server.mockEndpoint().put("/id").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.put.add({ + id: "id", + }); + expect(response).toEqual({ + errors: [ + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + { + category: "API_ERROR", + code: "INTERNAL_SERVER_ERROR", + detail: "detail", + field: "field", + }, + ], + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts new file mode 100644 index 000000000000..35b1405e89ca --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/union.test.ts @@ -0,0 +1,32 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UnionClient", () => { + test("getAndReturnUnion", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { animal: "dog", name: "name", likesToWoof: true }; + const rawResponseBody = { animal: "dog", name: "name", likesToWoof: true }; + server + .mockEndpoint() + .post("/union") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.union.getAndReturnUnion({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + expect(response).toEqual({ + animal: "dog", + name: "name", + likesToWoof: true, + }); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts new file mode 100644 index 000000000000..b450fbeea217 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/endpoints/urls.test.ts @@ -0,0 +1,68 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../../src/Client"; +import { mockServerPool } from "../../mock-server/MockServerPool"; + +describe("UrlsClient", () => { + test("withMixedCase", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().get("/urls/MixedCase").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.endpoints.urls.withMixedCase(); + expect(response).toEqual("string"); + }); + + test("noEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/no-ending-slash") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.noEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withEndingSlash", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with-ending-slash/") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withEndingSlash(); + expect(response).toEqual("string"); + }); + + test("withUnderscores", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server + .mockEndpoint() + .get("/urls/with_underscores") + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.endpoints.urls.withUnderscores(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts new file mode 100644 index 000000000000..61b5a64bce8f --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/inlinedRequests.test.ts @@ -0,0 +1,150 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("InlinedRequestsClient", () => { + test("postWithObjectBodyandResponse (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithObjectBodyandResponse (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { + string: "string", + integer: 1, + NestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }, + }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/req-bodies/object") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.inlinedRequests.postWithObjectBodyandResponse({ + string: "string", + integer: 1, + nestedObject: { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }, + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts new file mode 100644 index 000000000000..3317cf1a69d1 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noAuth.test.ts @@ -0,0 +1,48 @@ +// This file was auto-generated by Fern from our API Definition. + +import * as SeedExhaustive from "../../src/api/index"; +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoAuthClient", () => { + test("postWithNoAuth (1)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = true; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .jsonBody(rawResponseBody) + .build(); + + const response = await client.noAuth.postWithNoAuth({ + key: "value", + }); + expect(response).toEqual(true); + }); + + test("postWithNoAuth (2)", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = { key: "value" }; + const rawResponseBody = { message: "message" }; + server + .mockEndpoint() + .post("/no-auth") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(400) + .jsonBody(rawResponseBody) + .build(); + + await expect(async () => { + return await client.noAuth.postWithNoAuth({ + key: "value", + }); + }).rejects.toThrow(SeedExhaustive.BadRequestBody); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts new file mode 100644 index 000000000000..8f5f6a59a512 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/noReqBody.test.ts @@ -0,0 +1,58 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("NoReqBodyClient", () => { + test("getWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = { + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: "2024-01-15T09:30:00Z", + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: ["set"], + map: { "1": "map" }, + bigint: "1000000", + }; + server.mockEndpoint().get("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.getWithNoRequestBody(); + expect(response).toEqual({ + string: "string", + integer: 1, + long: 1000000, + double: 1.1, + bool: true, + datetime: new Date("2024-01-15T09:30:00.000Z"), + date: "2023-01-15", + uuid: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", + base64: "SGVsbG8gd29ybGQh", + list: ["list", "list"], + set: new Set(["set"]), + map: { + 1: "map", + }, + bigint: "1000000", + }); + }); + + test("postWithNoRequestBody", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + + const rawResponseBody = "string"; + server.mockEndpoint().post("/no-req-body").respondWith().statusCode(200).jsonBody(rawResponseBody).build(); + + const response = await client.noReqBody.postWithNoRequestBody(); + expect(response).toEqual("string"); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts new file mode 100644 index 000000000000..a128d4844ba2 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tests/wire/reqWithHeaders.test.ts @@ -0,0 +1,29 @@ +// This file was auto-generated by Fern from our API Definition. + +import { SeedExhaustiveClient } from "../../src/Client"; +import { mockServerPool } from "../mock-server/MockServerPool"; + +describe("ReqWithHeadersClient", () => { + test("getWithCustomHeader", async () => { + const server = mockServerPool.createServer(); + const client = new SeedExhaustiveClient({ maxRetries: 0, token: "test", environment: server.baseUrl }); + const rawRequestBody = "string"; + + server + .mockEndpoint() + .post("/test-headers/custom-header") + .header("X-TEST-SERVICE-HEADER", "X-TEST-SERVICE-HEADER") + .header("X-TEST-ENDPOINT-HEADER", "X-TEST-ENDPOINT-HEADER") + .jsonBody(rawRequestBody) + .respondWith() + .statusCode(200) + .build(); + + const response = await client.reqWithHeaders.getWithCustomHeader({ + xTestServiceHeader: "X-TEST-SERVICE-HEADER", + xTestEndpointHeader: "X-TEST-ENDPOINT-HEADER", + body: "string", + }); + expect(response).toEqual(undefined); + }); +}); diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json new file mode 100644 index 000000000000..d7627675de20 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.base.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "isolatedModules": true, + "isolatedDeclarations": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json new file mode 100644 index 000000000000..5c11446f5984 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.cjs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "CommonJS", + "outDir": "dist/cjs" + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json new file mode 100644 index 000000000000..6ce909748b2c --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "dist/esm", + "verbatimModuleSyntax": true + }, + "include": ["src"], + "exclude": [] +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json new file mode 100644 index 000000000000..d77fdf00d259 --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.cjs.json" +} diff --git a/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts new file mode 100644 index 000000000000..ba2ec4f9d45a --- /dev/null +++ b/seed/ts-sdk/exhaustive/serde-layer-zurg/vitest.config.mts @@ -0,0 +1,28 @@ +import { defineConfig } from "vitest/config"; +export default defineConfig({ + test: { + projects: [ + { + test: { + globals: true, + name: "unit", + environment: "node", + root: "./tests", + include: ["**/*.test.{js,ts,jsx,tsx}"], + exclude: ["wire/**"], + setupFiles: ["./setup.ts"], + }, + }, + { + test: { + globals: true, + name: "wire", + environment: "node", + root: "./tests/wire", + setupFiles: ["../setup.ts", "../mock-server/setup.ts"], + }, + }, + ], + passWithNoTests: true, + }, +}); diff --git a/seed/ts-sdk/seed.yml b/seed/ts-sdk/seed.yml index 490bf422e665..2978336d2886 100644 --- a/seed/ts-sdk/seed.yml +++ b/seed/ts-sdk/seed.yml @@ -84,9 +84,6 @@ fixtures: - outputFolder: serde-layer-zod customConfig: serializationFormat: zod - - outputFolder: serde-layer-none - customConfig: - serializationFormat: none - outputFolder: retain-original-casing customConfig: retainOriginalCasing: true